【发布时间】: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