我的护照本地策略出现错误,提示未定义密码

时间:2018-12-03 07:08:54

标签: javascript node.js passport.js es6-promise

我一直在尝试将我的代码从回调转换为promise。但是在答应了我的护照本地策略后,出现了一个错误,提示我的密码未定义。您能调查一下我的代码并检测出哪里出了错吗?

exports.newLocalStrategy=new localStrategy({
      usernameField: 'username',
      passwordField: 'password'
},(username,done)=>{
  User.findOne({username})
    .then(user =>{
      if(!user) return done(null, null, console.error('user or email incorrect'));
      return done(null, user);
    })
    .catch(err =>{
      return done(err, null);
  });
  comparePassword(password,user[0].password)
    .then(isMatch=>{
      if (isMatch) return (done, null);
  })
    .catch(err=>{
      console.error(err);
      return done(err, null);
    })
});
let comparePassword =new Promise((candidatePassword, hash, callback)=>{
  bcrypt.compare(candidatePassword, hash, (err, isMatch)=>{
    if (err) return callback(err);
    callback(null, isMatch);
    });
});

错误来自comparePassword(password,user[0].password)

1 个答案:

答案 0 :(得分:0)

您正在使用findOne。它只会返回一个文档对象,而不是数组。

因此您不必user[0].password

相反,只需使用user.password

此外,您的comparePassword密码需要在findOne之后执行。您需要将该调用放在您编写了findOne

return done(null, user);回调中

您可以了解有关findOne here

的更多信息