NodeJS无法从req.params.token获取令牌值

时间:2015-10-20 12:39:10

标签: node.js express token ejs

app.post('/reset/:token', function(req, res) {
  async.waterfall([
    function(done) {
      User.findOne({ 'local.resetPasswordToken' : req.params.token, 'local.resetPasswordExpires' : { $gt: Date.now() } }, function(err, user) {
        if (!user) {
          req.flash('resetMessage', req.params.token);
          return res.redirect('back');
        }
  ], function(err) {
    res.redirect('/');
  });
}); 

app.get('/reset/:token', function(req, res) {
    User.findOne({ 'local.resetPasswordToken': req.params.token, 'local.resetPasswordExpires' : { $gt: Date.now() } }, function(err, user) {
        if (!user) {
            req.flash('forgotMessage', req.params.token );
        return res.redirect('/forgot');
        }
        res.render('reset.ejs', { user: req.user, message: req.flash('resetMessage') });
    });
});



<!--Reset.ejs page ResetPassword FORM -->
<form action="/reset/:token" method="post">
    <div class="form-group">
        <label>New Password</label>
        <input type="text" class="form-control" name="newpassword">
    </div>
    <div class="form-group">
        <label>Confirm Password</label>
        <input type="text" class="form-control" name="confirmpassword">
    </div>
    <button type="submit" class="btn btn-warning btn-lg">Reset</button>
</form>

我能够通过req.params.token为#34; post&#34;获取令牌。点击后 http://localhost:8080/reset/fed831abf73150c96f6a3e392b5cbdcaccdeb9bd

稍后当我通过reset.ejs提交&#34; get&#34;我无法使用req.params.token检索任何令牌值。

任何解决方案?

2 个答案:

答案 0 :(得分:1)

我认为原始代码可能来自http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/。在这个tut中使用了玉石模板引擎,如果你看一下reset.jade,你会发现它以

开头。

form(method ='POST')

但未定义任何操作。我真的不懂玉,但在你的例子中,你使用的是ejs,在你的代码中,你正在设置行动

form action =“/ reset /:token”method =“post”

并且每个人都指出你发布的路由是/ reset /:token。所以req.params将是:令牌,重置将失败。您需要做的是完全按照get请求中显示的方式发布网址。如果您阅读

Is it a good practice to use an empty URL for a HTML form's action attribute? (action="")

你可以看到你可以修改你的reset.ejs页面代码来阅读

form action =“”method =“post”

现在帖子应该有一个等于get url的动作,并且令牌已经存在并且应该重置。

答案 1 :(得分:0)

您需要使用method='get'action='reset/' + tokenvar的其他表单。此外,您的异步瀑布不会调用done(),因此如果用户存在,则不会调用重定向