【问题标题】:passport-local-mongoose setPassword not working护照本地猫鼬 setPassword 不起作用
【发布时间】:2018-07-31 17:13:28
【问题描述】:

我正在尝试重置用户密码,并且正在使用 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) 之后调试它并输入参数,它显示两个输入为空,但我输入 req.body 它显示两个密码

【问题讨论】:

  • 只需在您的`user.setPassword(req.body.password, function(err,user){ 行之前添加一个debugger 语句并在chrome 中打开您的url(确保您也打开了Developer Console),当它到达调试点时,在控制台窗口中,只需输入 arguments 并查看它返回的内容。
  • 我必须安装轨迹。我使用轨迹对其进行了调试,它打印出 {'0': null, '1': null }。这意味着密码和确认为空,但这背后的原因是什么? @大卫R
  • 但是如果我输入 req.body 它会注销 { password: 'bito', confirm: 'bito' } 所以 req.body 也不为空。任何帮助表示赞赏:) @DavidR

标签: node.js mongodb token passport.js


【解决方案1】:

你忘记了分号。是你的问题吗?

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');
            }
        });
    }
 ])
})

【讨论】:

  • 我没有看到你添加的分号请你把它标记出来@phenric
  • 当然!就在最后一个 else 之前,你写了 }) 但我认为应该是 }); }); } else {
  • kk 我已经看到了,但这不是它引发相同错误的问题@phenric :) 供您回复
【解决方案2】:

根据您的信息和代码,我只能帮助您进行假设,提供更多信息,我会更新答案。

您确定根据您的条件找到该用户吗?

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

解决问题所需要做的就是调试所有内容都写入数据库并且您的条件能够匹配正确的用户。然后其他一切都将正常工作。

【讨论】:

  • 感谢您的回复,是的,在数据​​库中找到了用户,因为我使用令牌通过邮件向他们发送链接,因此如果存储在数据库中的令牌确实找不到用户不匹配,与发布路线相同。 @ghaiklor
  • setPassword 是 passport-local-mongoose 附带的一个功能,我不知道我是否使用的是较低版本。但我通过添加我的用户架构@ghaiklor 更新了我的问题
  • 你需要确保uses存在,因为如果没有找到记录,Mongo会返回null。我相信,您的条件与您正在寻找的用户不匹配。
  • 我的意思是,您的错误消息显示有人尝试在 null 上调用 setPassword 函数,正如您所期望的那样,这是您的用户,但事实并非如此。
  • 您在架构和条件中的resetpasswordExpires 中有错字。但是,实际上,我们已经为您指明了正确的方向,请尝试自行修复。更新了答案。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 2019-04-25
  • 2021-10-24
  • 1970-01-01
  • 2016-10-19
  • 2017-04-02
  • 2021-05-20
  • 2016-06-21
相关资源
最近更新 更多