我一直在尝试将我的代码从回调转换为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)
行
答案 0 :(得分:0)
您正在使用findOne
。它只会返回一个文档对象,而不是数组。
因此您不必user[0].password
。
相反,只需使用user.password
。
此外,您的comparePassword
密码需要在findOne
之后执行。您需要将该调用放在您编写了findOne
return done(null, user);
回调中
您可以了解有关findOne
here