【问题标题】:How to get value from URL using Node.js and Express?如何使用 Node.js 和 Express 从 URL 中获取价值?
【发布时间】:2019-02-03 03:20:38
【问题描述】:

我正在尝试从以下 URL http://localhost:3000/users/reset/e3b40d3e3550b35bc916a361d8487aefa30147c8 获取令牌值。我有一个获取请求,用于检查令牌是否有效并将用户重定向到重置密码屏幕。我也有一个发布请求,但是当我控制台req.params.token 时,它输出:token 而不是e3b40d3e3550b35bc916a361d8487aefa30147c8。我想知道表单操作是否正确但不知道如何从中获取令牌值。

重置密码获取请求

router.get('/reset/:token', (req, res) => {
  console.log(req.params.token) // e3b40d3e3550b35bc916a361d8487aefa30147c8
  User.findOne({
    resetPasswordToken: req.params.token,
    resetPasswordExpires: {
      $gt: Date.now() 
    }
  }, (err, user) => {
    if (!user) {
      req.flash('error_msg', 'The password reset token is invalid or has expired.')
      return res.redirect('/users/forgot')
    }
    res.render('reset')
  })
})

reset.ejs

<% include ./partials/messages %>
<form action="/users/reset/:token" method="POST">
    <div class="form-group">
    <label for="password">Password</label>
    <input type="password" id="password" name="password" class="form-control" placeholder="Please enter a password."
        value="<%= typeof password != 'undefined' ? password : '' %>" />
    </div>
    <button type="submit" class="btn btn-primary btn-block">Register</button>
</form>

重置密码发布请求

router.post('/reset/:token', (req, res) => {
  console.log(req.params.token) // :token
  User.findOne({
    resetPasswordToken: req.params.token,
    resetPasswordExpires: {
      $gt: Date.now() 
    }
  }, (err, user) => {
    if (!user) {
      req.flash('error_msg', 'The password reset token is invalid or has expired.')
      return res.redirect('/users/forgot')
    }

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

    user.save(function (err) {
      req.flash('success_msg', 'Working.')
      return res.redirect('/users/login')
    })
  })
})

【问题讨论】:

  • 您希望action="/users/reset/:token" 在您的表单发布网址中做什么?它实际上只是将其作为 URL 中带有 :token 的 URL 发送(: 将被编码,但你明白了)。
  • @jfriend00 从http://localhost:3000/users/reset/e3b40d3e3550b35bc916a361d8487aefa30147c8,我试图从字符串中获取e3b40d3e3550b35bc916a361d8487aefa30147c8
  • 但是,这不是您所说的问题所在的表单帖子的 URL。它已经适用于 GET URL,因为 URL 是正确的。这就是我对表单发布 URL 的评论的重点。您的表单 POST 在 URL 中有 :token,而不是您想要的 e3b40d3e3550b35bc916a361d8487aefa30147c8
  • @jfriend00 是的,正确,但是此令牌会在 60 分钟后更改并过期,因此我无法将值硬编码。我必须以其他方式获取它。使用 req.params.token 适用于 get 请求,但不适用于 post 请求
  • 如果您希望它在表单发布 URL 中,您必须将令牌放入页面中的表单发布 URL 中。没有其他方法可以让它神奇地出现在 URL 中。您将它放在 GET 的 URL 中,而不是 POST> 根据您在这里真正做的事情,还有其他地方可以放置令牌,例如在表单字段中,在服务器端会话对象中该用户等...

标签: javascript node.js express


【解决方案1】:

在你的 HTML 表单中,你有这个:

<form action="/users/reset/:token" method="POST">

这将使表单发布时请求的实际 URL 成为:

/users/reset/:token

这里没有代码可以替换:token。这只是作为 URL 直接发送到服务器。

所以,当你有:

router.post('/reset/:token', (req, res) => {
    console.log(req.url);            // "/user/reset/:token"
    console.log(req.params.token);   // ":token"
});

req.params.token 向您显示的是 URL 中/users/reset 之后的任何内容。在您的情况下,这是文字字符串":token"。要让req.params.token 实际上必须在其中标记,您必须将实际标记插入 URL,以便您的表单标记如下所示:

<form action="/users/reset/e3b40d3e3550b35bc916a361d8487aefa30147c8" method="POST">

或者,您必须通过其他方式访问令牌,例如通过快速会话、cookie、表单中的字段等...

【讨论】:

    【解决方案2】:

    获取 URL 参数的值

    app.get('/reset/:token', function(req, res) {
        res.send("token is " + req.params.token);
    });
    

    获取查询参数?token=Adhgd5645

    app.get('/reset/?token=Adhgd5645', function(req, res) {
        res.send("token is " + req.query.token);
    });
    

    【讨论】:

      猜你喜欢
      • 2016-10-01
      • 2023-03-03
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2017-08-18
      • 2021-05-26
      相关资源
      最近更新 更多