我正在使用本地护照,我已经在我的mongo数据库中删除了我的密码。我无法弄清楚为什么我的bcrypt.compare()无法正常工作。它说“cb不是一种功能”,但确实如此。我只是将回调保存为同一文件中的变量,而不是将其保存在我的用户模式中。有人遇到过这个问题或在我的代码中看到任何错误吗?
passport.use(new LocalStrategy((username, password, done) => {
User.findOne({ username: username }).exec().then((user, err) => {
if (err) return done(err)
if (!user) return done(null, false, { message: 'Incorrect username.' })
const comparePassword = function (candidatePassword, hashedPassword, cb) {
bcrypt.compare(candidatePassword, hashedPassword, function (err, isMatch) {
if (err) return cb(err)
return cb(null, isMatch)
})
}
comparePassword(password, user.password, function (err, isMatch) {
if (err) return done(err)
if (!isMatch) return done(null, false, { message: 'Incorrect password.' })
return done(null, user)
})
})
}))
答案 0 :(得分:1)
我也有同样的错误,只需重新安装npm and bcrypt
,请注意!查看您正在使用的节点版本也很重要。问候
答案 1 :(得分:0)
因此,经过几个小时的bcrypt.compare苦苦挣扎,我决定清理我的数据库并从头开始创建新用户。我最终使用了bcrypt.compareSync(),最后验证了我的密码!因此,在将用户/任何内容添加到数据库之前,请确保已在模型上定义了所有方法。我以为我已经添加了比较功能,但我想我错了。感谢您的所有帮助!
答案 2 :(得分:0)
之前我遇到过这样的事情。它与异步处理和所有代码已经在promise(user.findOne())的.then()处理程序中有关。混合承诺和回调模式通常不是一个好主意。
我最终做的是将promisePassword函数包装在promise中,然后将其包含在promise链中。我的代码完全不同,但在你的情况下,它看起来像这样:
passport.use(new LocalStrategy((username, password, done) => {
function comparePassword(candidatePassword, hashedPassword) {
return new Promise((resolve, reject) => {
bcrypt.compare(candidatePassword, hashedPassword,
(err, isMatch) => {
if (err) return reject(err);
else if (!isMatch) reject(new Error('Incorrect Password'));
else resolve();
});
});
})
User.findOne({ username: username }).exec()
.then((user, err) => {
if (err) return done(err)
if (!user) return done(null, false, { message: 'Incorrect username.' })
return comparePassword(password, user.password)
})
.then(/*do stuff if password is a match*/)
.catch(/*do stuff iff not a match*/)
}))
您也可以尝试
return comparePassword(password, user.password, function (err, isMatch) {
在.then()的末尾,我在.then()之外声明comparePassword,就像我上面的代码一样。
答案 3 :(得分:-1)
代码看起来不错。虽然我没有测试它。
您的密码比较必须是aSync吗?你考虑过使用bcrypt.compareSync吗?
示例:
MyPasswordTool.prototype.validateHashedPassword = function(challlenger, hashedPassword) {
return bcrypt.compareSync(challlenger, hashedPassword);
};