NodeJS 无法从 req.params.token 获取令牌值
NodeJS not able to get token value from req.params.token
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 获得 "post" 的令牌
http://localhost:8080/reset/fed831abf73150c96f6a3e392b5cbdcaccdeb9bd
稍后,当我通过 reset.ejs 提交 "get" 时,我无法使用 req.params.token 检索到任何令牌值。
有什么解决办法吗?
我想这个的原始代码可能来自 http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/。在此教程中使用了 jade 模板引擎,如果您查看 reset.jade,您会发现它以
开头
形式(方法='POST')
但未定义任何操作。我真的不知道玉,但在你的例子中你使用的是 ejs 并且在你的代码中你将操作设置为
表单动作="/reset/:token" 方法="post"
正如每个人都指出的那样,您 post 的路线恰好是 /reset/:token。所以 req.params 将是 :token 并且重置将失败。您需要做的是 post 和 url 与 get 请求中显示的完全一样。如果你阅读
Is it a good practice to use an empty URL for a HTML form's action attribute? (action="")
你可以看到你可以修改你的reset.ejs页面代码阅读
表单动作=""方法="post"
现在 post 应该有一个等同于获取 url 的操作,并且令牌就位并且应该发生重置。
您需要另一个带有 method='get'
和 action='reset/' + tokenvar
的表格。此外,您的异步瀑布不会调用 done() 因此如果用户存在则不会调用重定向
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 获得 "post" 的令牌 http://localhost:8080/reset/fed831abf73150c96f6a3e392b5cbdcaccdeb9bd
稍后,当我通过 reset.ejs 提交 "get" 时,我无法使用 req.params.token 检索到任何令牌值。
有什么解决办法吗?
我想这个的原始代码可能来自 http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/。在此教程中使用了 jade 模板引擎,如果您查看 reset.jade,您会发现它以
开头形式(方法='POST')
但未定义任何操作。我真的不知道玉,但在你的例子中你使用的是 ejs 并且在你的代码中你将操作设置为
表单动作="/reset/:token" 方法="post"
正如每个人都指出的那样,您 post 的路线恰好是 /reset/:token。所以 req.params 将是 :token 并且重置将失败。您需要做的是 post 和 url 与 get 请求中显示的完全一样。如果你阅读
Is it a good practice to use an empty URL for a HTML form's action attribute? (action="")
你可以看到你可以修改你的reset.ejs页面代码阅读
表单动作=""方法="post"
现在 post 应该有一个等同于获取 url 的操作,并且令牌就位并且应该发生重置。
您需要另一个带有 method='get'
和 action='reset/' + tokenvar
的表格。此外,您的异步瀑布不会调用 done() 因此如果用户存在则不会调用重定向