我试图重置用户密码,并使用passport-local-mongoose,我通过邮件发送重置链接,并且还会在链接中添加一个令牌。链接打开但是当用户点击重置按钮时,它会在我的命令行中引发错误 null
passortLocalMongoose = require("passport-local-mongoose")
var UserSchema = new mongoose.Schema({
email: {type: String, unique: true},
password: String,
resetPasswordToken: String,
resetpasswordExpires: Date
})
UserSchema.plugin(passortLocalMongoose);
mongoose.model("User", UserSchema )
app.post('/reset/:token', function(req, res, next) {
asynco.waterfall([
function(done) {
User.findOne({resetPasswordToken :req.params.token, resetPasswordExpires: { $gt: Date.now()}}, function(err, user) {
if(!user){
console.log(err);
req.flash('error', 'Password reset token is invalid or has expired')
return res.redirect('back')
}
if(req.body.password === req.body.confirm) {
user.setPassword(req.body.password, function(err,user){
if(err){
console.log(err)
req.flash('error', 'Sorry something went wrong')
return res.redirect('back')
} else {
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function(err){
req.login(user, function(err){
done(err,user)
})
})
}
})
} else {
req.flash('error', 'Passwords do not match')
res.redirect('back');
}
})
}
])
})
当用户点击提交按钮时出现错误
null
如果我在 if(req.body.password == req.body.confirm)之后调试它并输入参数,它会显示两个输入为null但我键入req.body它显示两个密码
答案 0 :(得分:0)
app.post('/reset/:token', function(req, res, next) {
asynco.waterfall([
function(done) {
User.findOne({resetPasswordToken :req.params.token, resetPasswordExpires: { $gt: Date.now()}}, function(err, user) {
if(err){
console.log(err);
req.flash('error', 'Password reset token is invalid or has expired')
return res.redirect('back')
}
if(req.body.password === req.body.confirm) {
user.setPassword(req.body.password, function(err,user){
if(err){
console.log(err)
req.flash('error', 'Sorry something went wrong')
return res.redirect('back')
} else {
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function(err){
req.login(user, function(err){
done(err,user)
})
})
}
});
} else {
req.flash('error', 'Passwords do not match')
res.redirect('back');
}
});
}
])
})
答案 1 :(得分:0)
根据您的信息和代码,我可以仅为您提供假设,提供更多信息,我会更新答案。
您确定找到了符合条件的用户吗?
User.findOne({
resetPasswordToken: req.params.token,
resetPasswordExpires: { $gt: Date.now()}
}, function(err, user) {
if (err) {} // Handle the error
if (!user) {} // User is not found, but no error as well
// only then try to call setPassword
});
我打赌,你的标准是错误的,这就是Mongo返回null
而不是用户记录的原因。
解决问题所需要做的就是调试一切都是在数据库中写入,并且您的条件能够匹配正确的用户。其他一切都将起作用。