【问题标题】:NodeJS not able to get token value from req.params.tokenNodeJS 无法从 req.params.token 获取令牌值
【发布时间】:2016-01-19 03:04:39
【问题描述】:
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 获取“帖子”的令牌 http://localhost:8080/reset/fed831abf73150c96f6a3e392b5cbdcaccdeb9bd

后来,当我通过 reset.ejs 提交“get”时,我无法使用 req.params.token 检索到任何令牌值。

有什么解决办法吗?

【问题讨论】:

  • 您没有将实际令牌传递给表单操作。
  • 表单操作使用“/reset/:token”,但我希望 Tedd 在这里填写实际令牌而不是“:token”。
  • 我无法弄清楚我应该如何写它才能在那里填充它。
  • 您是否打开了浏览器的调试器并检查了实际的 GET 请求?这可能会有所帮助。

标签: node.js express token ejs


【解决方案1】:

我想这个的原始代码可能来自http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/。在本文中使用了翡翠模板引擎,如果您查看 reset.jade,您会看到它以

开头

表单(方法='POST')

但未定义任何操作。我真的不知道玉,但在您的示例中,您使用的是 ejs,并且在您的代码中,您将操作设置为

form action="/reset/:token" method="post"

正如每个人都指出的那样,您发布的路线正是 /reset/:token。所以 req.params 将是 :token 并且重置将失败。您需要做的是完全按照获取请求中显示的网址发布网址。如果你读过

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

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

form action="" method="post"

现在帖子应该有一个与获取 url 相同的操作,并且应该会发生重置。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。我修好了。
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2018-06-17
    • 2013-03-05
    • 2023-02-14
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多