Mongoose从查询中设置本地变量
Mongoose set local variable from query
我有一个函数,它基本上是向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是如何异步工作的。您的局部变量正在被设置,但要等到您使用它之后。执行顺序看起来像:
- 角色查询完成
- 开始获取凭据查询
- 开始获取角色查询
- 凭据查询完成
- 角色查询完成
正如您所看到的,凭证和角色查询都是同时启动的。设置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);
});
});
现在执行如下:
- 角色查询完成
- 开始获取凭据查询
- 凭据查询完成
- 角色查询开始
- 角色查询完成并设置响应
相关文章:
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- Javascript使用变量设置属性
- 敲除js变量设置类似于调用函数
- 使用输入变量设置元素的值
- 为什么我们将控制器变量设置为等于“0”;这个“;在角度上
- 将外部控制器的范围变量设置为角度
- 谷歌地图标记在通过变量设置标记和经度时不保持不变
- 尝试在 jquery ajax 帖子中将变量设置为URL 的一部分
- 如果循环中至少有一个元素返回 false,如何将变量设置为 false
- 如何将宽度和高度变量设置为浏览器窗口的宽度和高度
- 如何将变量设置为外部内容
- 需要将变量设置为特定的数字范围
- 执行批处理文件的Javascript,该文件包含基于每个会话的环境变量设置
- 如何在jquery中基于变量设置某个东西的宽度
- 将变量设置为等于本地JSON文件
- 根据Angular中的单独变量设置下拉默认值
- 如何使用JavaScript变量设置函数集css宽度
- 如何为一个javascript变量设置give多个值
- 如何将javascript变量设置为php变量并将其存储在数据库中
- 如何在javascript中为变量设置一行setter