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正在设置,但不会在您使用它之后。 执行顺序如下所示:
- angular色查询完成
- 获取凭据查询开始
- 获取angular色查询开始
- 凭据查询结束
- 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); }); });
现在执行如下所示:
- angular色查询完成
- 获取凭据查询开始
- 凭据查询结束
- angular色查询开始
- angular色查询完成并设置响应