Mongoose从查询中设置本地变量

Mongoose set local variable from query

本文关键字:变量 设置 查询 Mongoose      更新时间:2023-09-26

我有一个函数,它基本上是向MongoDB查询凭证(简化):

var query = Credential.findOne({token: token});
return query.exec(function (err, credential) {
    if (err) return null;
    return credential;
});

我需要这个credential用于另一个查询,以获得关联的角色:

router.get('/api/roles', function (req, res) {
   var token = req.headers.authorization || '';
   var cred;
   if (token === '') {
       return res.sendStatus(401);
   }
   getCredential(token).then(function (credential) {
      cred = credential;
   });
   getRoles(cred).then(function(roles) {
      return res.json(roles);
   });
});

不幸的是,我似乎无法从已解析的promise中设置局部变量cred,因此它是undefined。知道怎么做吗?

您似乎不太了解promise是如何异步工作的。您的局部变量正在被设置,但要等到您使用它之后。执行顺序看起来像:

  1. 角色查询完成
  2. 开始获取凭据查询
  3. 开始获取角色查询
  4. 凭据查询完成
  5. 角色查询完成

正如您所看到的,凭证和角色查询都是同时启动的。设置cred的回调在凭据查询完成之前不会运行,所以为时已晚。你可以利用承诺来解决这个问题。

router.get('/api/roles', function (req, res) {
    var token = req.headers.authorization || '';
    if (token === '') {
        return res.sendStatus(401);
    }
    getCredential(token).then(function (credential) {
        // getRoles returns a promise
        // The next "then()" will be called when this
        // promise is resolved
        return getRoles(credential);
    })
    .then(function(roles) {
        res.json(roles);
    });
});

现在执行如下:

  1. 角色查询完成
  2. 开始获取凭据查询
  3. 凭据查询完成
  4. 角色查询开始
  5. 角色查询完成并设置响应