0

私は次のコードを持っています:

server.use(function(req, res, next) {
    users_db.set(req.user, function(err) { // async call to mongodb
        if (err) {
          console.error(err);
        }
      });
    }
    return next();
});

server.get('/', function(req, res) {
    req.user.active = true; // this is a new field in user object
    res.send(req.user);
    }
});

ご覧のとおり、users_db.set()が呼び出されたときreq.userにフィールドがありませんactive=true。関数にのみ挿入されていserver.get()ます。

user.active = trueそれにもかかわらず、呼び出しの非同期性のためにデータベースに登録されている可能性はありますか?

4

1 に答える 1

0

私の知る限り (少なくとも Express ではそうです)、.get メソッドは多くのミドルウェア関数を受け入れます。したがって、次のように動作すると思います。

server.get(
    '/', 
    function(req, res, next) {
        req.user.active = true; // this is a new field in user object
        res.send(req.user);
        next();
    },
    function(req, res, next) {
        users_db.set(req.user, function(err) { // async call to mongodb
            if (err) {
              console.error(err);
            }
          });
        }
        return next();
    }
);

そのようなことを行うと、users_db.set でその瞬間に到達する前に、req.user.active が常に読み込まれることが確実になります。

于 2013-08-25T13:19:07.007 に答える