passport-local-mongoose setPassword无效

时间:2018-02-21 07:45:16

标签: node.js mongodb token passport.js

我试图重置用户密码,并使用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它显示两个密码

2 个答案:

答案 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而不是用户记录的原因。

解决问题所需要做的就是调试一切都是在数据库中写入,并且您的条件能够匹配正确的用户。其他一切都将起作用。