bcrypt.compare cb不是函数错误

时间:2016-06-15 01:18:09

标签: javascript node.js bcrypt

我正在使用本地护照,我已经在我的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)
 })
})
}))

4 个答案:

答案 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);
};