我有一個基本的貓鼬身份驗證,與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方法(它被調用) ,但它不會解決承諾也不會拋出錯誤。在我的user.js的定義我UserSchema我有這樣的代碼來比較口令:
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(...),這不可能嗎?
我在做什麼錯?
UPDATE:
如果我把它的工作原理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.validate(req.body.password)])''應''Promise.all( [Promise.resolve(user),user.validate(req.body.password)])'' – MatthieuLemoine
@MatthieuLemoine是的,這似乎是合理的,但試過了,它不起作用:S – godzsa
不確定,但我認爲你的validate方法應該也解決了承諾。 –