mongoose从查询设置本地variables

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

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

我需要这个credential的另一个查询来获得相关的angular色:

 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); }); }); 

不幸的是,我似乎无法在已解决的承诺中设置局部variablescred ,因此它是undefined 。 任何想法如何做到这一点?

看起来你不太清楚承诺是如何asynchronous工作的。 您的本地variables正在设置,但不会在您使用它之后。 执行顺序如下所示:

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

如您所见,凭证和angular色查询都是同时启动的。 设置cred的callback在证书查询结束之前不会运行,所以这太迟了。 你可以利用承诺来解决这个问题。

 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. angular色查询完成
  2. 获取凭据查询开始
  3. 凭据查询结束
  4. angular色查询开始
  5. angular色查询完成并设置响应