2016-05-12 45 views
0

google搜索,我终于发布我有史以来第一个问题两天后:PassportJS /忘记密码:req.user未定义只有一次

我尝试在我的的NodeJS实行忘记密码功能快速,网站下面这个:http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/

事情是,在app.post('重置/:令牌')路线,req.user是未定义的,但它是唯一的地方在我的代码中它的未定义!

我认为它可能来自“独特的链接”类型的路线,但不知道如何解决这个问题。

.ejs对“重置/:令牌”操作的表单也一样。

这样resetPasswordToken不能输入新的密码后,发现..

app.get('/reset/:token', function(req, res) { 
    user.findOne({ 
     resetPasswordToken: req.params.token, 
     resetPasswordExpires: { 
      $gt: Date.now() 
     } 
    }, function(err, user) { 
     if (!user) { 
      req.flash('error', 'Password reset token is invalid or has expired.'); 
      return res.redirect('/forgot'); 
     } 
     res.render('./pages/reset.ejs', { 
      username: req.user 
     }); 
    }); 
}); 

app.post('/reset/:token', function(req, res) { 
    async.waterfall([ 
     function(done) { 
      console.log('user: ' + req.user); 
      user.findOne({ 
       resetPasswordToken: req.params.token, 
       resetPasswordExpires: { 
        $gt: Date.now() 
       } 
      }, function(err, user) { 
       if (!user) { 
        req.flash('error', 'Password reset token is invalid or has expired.'); 
        return res.redirect('back'); 
       } 

       user.password = req.body.password; 
       user.resetPasswordToken = undefined; 
       user.resetPasswordExpires = undefined; 

       user.save(function(err) { 
        req.logIn(user, function(err) { 
         done(err, user); 
        }); 
       }); 
      }); 
     }, 
     function(user, done) { 
      var mailOptions = { 
       to: user.email, 
       from: '[email protected]', 
       subject: 'Your password has been changed', 
       text: 'Hello,\n\n' + 
        'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n' 
      }; 
      smtpTransport.sendMail(mailOptions, function(err) { 
       req.flash('success', 'Success! Your password has been changed.'); 
       done(err); 
      }); 
     } 
     `enter code here` 
    ], function(err) { 
     res.redirect('/'); 
    }); 
}); 

其实,这是我的第一篇文章在这里,坏压痕抱歉..

回答

0

事实上,req.user应在此页面上为空,因为您没有通过身份验证(您正在修改密码才能登录),并且req.user(护照文档)在身份验证时包含用户。

+0

非常感谢您的回答安东尼,那东西是user.findOne不起作用。 它可能来自req.params.token,当我console.log它返回“:token”。 我怎样才能得到令牌? – Naguib

+0

你能给我更多的信息吗?在帖子或你的链接?因为您的令牌应该生成并发送到用户的电子邮件中。所以当用户点击电子邮件时,它将有一个链接,如:localhost:8000/reset/wrotesomething - >在这里,我的req.params.token将是一些东西。 拍摄我制作的样板文件,它可能会帮助您了解相似的系统:https://github.com/haukka/sequelize-express-passport 也许您会在上面找到您的答案(在剧目中路线,文件索引)对不起,你会发现一些法文文本。 –