繁体   English   中英

如何使用Node.js和Express从URL获得价值?

[英]How to get value from URL using Node.js and Express?

我正在尝试从以下URL http://localhost:3000/users/reset/e3b40d3e3550b35bc916a361d8487aefa30147c8获取令牌值。 我有一个get请求,该请求检查令牌是否有效并将用户重定向到重置密码屏幕。 我也有一个发布请求,但是当我控制台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')
    })
  })
})

在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向您显示的是/users/reset之后的URL中的内容。 在您的情况下,这是文字字符串":token" 为了使req.params.token实际上必须在其中标记,您必须将实际标记插入URL,以便您的表单标签如下所示:

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

或者,您将必须以其他方式访问令牌,例如从快速会话,cookie,表单中的字段等。

获取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);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM