我正在尝试从以下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')
})
})
})
答案 0 :(得分: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
向您显示的内容就是/users/reset
之后的URL中的内容。在您的情况下,这就是文字字符串":token"
。为了使req.params.token
实际上必须在其中进行标记,您必须将实际的标记插入URL,以便您的表单标签如下所示:
<form action="/users/reset/e3b40d3e3550b35bc916a361d8487aefa30147c8" method="POST">
或者,您将必须以其他方式访问令牌,例如从快速会话,cookie,表单中的字段等。
答案 1 :(得分:0)
获取网址参数的值
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);
});