【发布时间】:2017-05-16 11:19:56
【问题描述】:
我有一个基本的猫鼬身份验证,使用 bcryptjs 来散列密码。 bcrypt 和 mongoose 都返回承诺。在我的 routes.js 中,我有以下脚本在数据库中找到用户后卡住了:
routes.post('/auth', (req, res)=> {
User.findOne({'local.username': req.body.username})
.then(
user=> Promise.all([user, user.validate(req.body.password)])
)
.then(
results => {
console.log(results);
res.json({token: jwt.sign({id: results[0]._id}, config.secret)});
}
)
.catch(
err=> console.log(err)
);
});
如您所见,我找到了用户,然后尝试调用其 validate 方法(该方法被调用),但它不会解决承诺,也不会引发错误。在定义我的 UserSchema 的 user.js 中,我有这段代码来比较密码:
UserSchema.methods.validate = function (password) {
return bcrypt.compare(password, this.local.password);
};
这被调用了,但返回的承诺似乎消失了,它没有被解析,结果变量永远不会被记录。
还有一件事,如果我将用户验证代码编辑为:
UserSchema.methods.validate = function (password) {
return bcrypt.compare(password, this.local.password).then(
results => {
console.log(results)
}
)
};
我真的登录到控制台,所以它必须工作,但我不想在这里解决我的承诺,我想在我的路由器中附加 .then(...),这不可能吗?
我做错了什么?
更新:
如果我将 compare 方法放在 routes.js 中它可以工作,但这不是我想要做的,我想将它保留在 user.js 中,但我认为这可能会指出我仍然存在的问题看不到。我想我必须立即按承诺调用 then(),但我不明白为什么。
User.findOne({'local.username': req.body.username})
.then(
user=> Promise.all([user, bcrypt.compare(req.body.password,user.local.password)])
)
.then(
results => {
console.log(results);
res.json({token: jwt.sign({id: results[0]._id}, config.secret)});
}
)
.catch(
err=> console.log(err)
);
【问题讨论】:
-
Promise.all([user, user.validate(req.body.password)])应该是Promise.all([Promise.resolve(user), user.validate(req.body.password)]) -
@MatthieuLemoine 是的,这似乎是合理的,但尝试过它并不起作用:S
-
不确定,但我认为您的验证方法也应该解决承诺。
-
仅在
validate函数中尝试return bcrypt.compare(password, this.local.password)。 -
@MatthieuLemoine 不需要,
Promise.resolve被Promise.all隐式调用。
标签: javascript node.js mongoose es6-promise