PassportJS / 忘记密码:req.user undefined only once
PassportJS / Forgot password : req.user undefined only once
经过两天的谷歌搜索,我终于 post 我的第一个问题:
我尝试在我的 NodeJS、Express 中实现忘记密码功能,网站如下:http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/
问题是,在 app.post('reset/:token') 路由中,req.user 未定义,但它是我代码中唯一未定义的地方!
我认为它可能来自 "unique link" 类型的路线,但不确定也不知道如何解决这个问题。
.ejs
动作中的表格也'reset/:token'。
这样输入新密码就找不到resetPasswordToken
..
app.get('/reset/:token', function(req, res) {
user.findOne({
resetPasswordToken: req.params.token,
resetPasswordExpires: {
$gt: Date.now()
}
}, function(err, user) {
if (!user) {
req.flash('error', 'Password reset token is invalid or has expired.');
return res.redirect('/forgot');
}
res.render('./pages/reset.ejs', {
username: req.user
});
});
});
app.post('/reset/:token', function(req, res) {
async.waterfall([
function(done) {
console.log('user: ' + req.user);
user.findOne({
resetPasswordToken: req.params.token,
resetPasswordExpires: {
$gt: Date.now()
}
}, function(err, user) {
if (!user) {
req.flash('error', 'Password reset token is invalid or has expired.');
return res.redirect('back');
}
user.password = req.body.password;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function(err) {
req.logIn(user, function(err) {
done(err, user);
});
});
});
},
function(user, done) {
var mailOptions = {
to: user.email,
from: 'passwordreset@demo.com',
subject: 'Your password has been changed',
text: 'Hello,\n\n' +
'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n'
};
smtpTransport.sendMail(mailOptions, function(err) {
req.flash('success', 'Success! Your password has been changed.');
done(err);
});
}
`enter code here`
], function(err) {
res.redirect('/');
});
});
这实际上是我第一次 post 在这里,抱歉缩进错误..
事实上,req.user在这个页面上应该是空的,因为你没有经过身份验证(你正在修改密码以登录)并且req.user(护照文件)包含用户 when他通过了身份验证。
终于成功了,来自reset.ejs表单动作,
一切都在这里解释:
经过两天的谷歌搜索,我终于 post 我的第一个问题:
我尝试在我的 NodeJS、Express 中实现忘记密码功能,网站如下:http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/
问题是,在 app.post('reset/:token') 路由中,req.user 未定义,但它是我代码中唯一未定义的地方!
我认为它可能来自 "unique link" 类型的路线,但不确定也不知道如何解决这个问题。
.ejs
动作中的表格也'reset/:token'。
这样输入新密码就找不到resetPasswordToken
..
app.get('/reset/:token', function(req, res) {
user.findOne({
resetPasswordToken: req.params.token,
resetPasswordExpires: {
$gt: Date.now()
}
}, function(err, user) {
if (!user) {
req.flash('error', 'Password reset token is invalid or has expired.');
return res.redirect('/forgot');
}
res.render('./pages/reset.ejs', {
username: req.user
});
});
});
app.post('/reset/:token', function(req, res) {
async.waterfall([
function(done) {
console.log('user: ' + req.user);
user.findOne({
resetPasswordToken: req.params.token,
resetPasswordExpires: {
$gt: Date.now()
}
}, function(err, user) {
if (!user) {
req.flash('error', 'Password reset token is invalid or has expired.');
return res.redirect('back');
}
user.password = req.body.password;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function(err) {
req.logIn(user, function(err) {
done(err, user);
});
});
});
},
function(user, done) {
var mailOptions = {
to: user.email,
from: 'passwordreset@demo.com',
subject: 'Your password has been changed',
text: 'Hello,\n\n' +
'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n'
};
smtpTransport.sendMail(mailOptions, function(err) {
req.flash('success', 'Success! Your password has been changed.');
done(err);
});
}
`enter code here`
], function(err) {
res.redirect('/');
});
});
这实际上是我第一次 post 在这里,抱歉缩进错误..
事实上,req.user在这个页面上应该是空的,因为你没有经过身份验证(你正在修改密码以登录)并且req.user(护照文件)包含用户 when他通过了身份验证。
终于成功了,来自reset.ejs表单动作,
一切都在这里解释: