node.js - 重置密码令牌 nodejs 和 express, throw er; // 未处理的“错误”事件 ^ 错误:回调已被调用
问题描述
我正在尝试使用 nodemailer 重置密码。我正在向用户邮件地址发送一封邮件,其中包含重置密码的链接。单击页面上的更新密码链接后,它会引发以下错误:-
throw er; // Unhandled 'error' event
^
Error: Callback was already called.
我不知道错误是什么,回调是什么意思已经被调用?
这是我的帖子请求代码:-
app.post('/reset/:token', function(req, res) {
async.waterfall([
function(done) {
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);
});
});
});
// res.redirect('/login');
},
function(user, done) {
var smtpTransport = nodemailer.createTransport('SMTP', {
// host:'smtp.gmail.com',
service: 'Gmail',
auth: {
user: 'myemail',
pass: 'password'
}
});
var mailOptions = {
to: user.email,
from: 'my email',
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) {
done(err);
});
}
], function(err) {
res.redirect('/');
});
});
我也没有在用户电子邮件上收到任何确认邮件..提前谢谢
解决方案
您的代码中有几个类似的错误可能会导致错误Error: Callback was already called.
return res.redirect('back');
当您在回调中执行(例如)时,该return
语句不会影响父函数。因此,可能会res.something
发生之前已经发生的事情 res.anotherSomething
,但这是不允许的。
尝试使用异步等待,而不是使用回调。
推荐阅读
- javascript - 通过 express.static 包含一个节点模块
- arrays - Matlab - 能够将结构的字段分成几个较小的字段
- flutter - 如何在 Flutter 插件中获取活动?
- java - 模块化 = true 的 Spring Batch 不适用于多个作业
- html - 在放入新文件夹后试图让 css 与 HTML 对话
- python - Python网络抓取请求不断得到机器人
- c++ - 它是 gcc -O2 优化错误(与 -O1 的结果不同)吗?
- pine-script - 如何在交易视图的松脚本中获取一天中的柱数?
- reactjs - 将回调函数作为道具传递给孩子
- javascript - 如何在点击时按顺序创建表格?