我正在构建一个Angular 4和Node应用程序。一旦任何用户在前端注册,我将他们的数据存储在数据库中,然后希望使用nodemailer
包向他们发送成功的注册电子邮件。
这里是Node js代码:
router.post('/', function(req, res, next) {
SOME_DATABASE_FUNC() {
if(FAILED_CASE) {
return res.status(500).json({
title: 'An error occurred',
status: 500,
error: error
});
var mailOptions {...}
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
console.log(error);
return res.status(500).json({
title: 'An error occurred',
status: 500,
error: error
});
}
console.log('Message', info.messageId, info.response);
return res.status(200).json({
message: 'Emailed successfully',
details: info
});
});
}
}
});
此代码运行良好,但发送电子邮件只需几秒钟,用户必须等待显示看起来不合适的成功响应。相反,我想在后台发送它可能是一个异步函数或者像一个cron作业。
但我不知道如何转换代码以将其作为作业发送,而不是在数据库事务之后发送和等待。请帮我解决这个问题。
答案 0 :(得分:0)
使用Process.nextTick()发送电子邮件
答案 1 :(得分:0)
在transporter.sendMail块之外发送响应。所以它不会等待电子邮件发送过程完成。
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
console.log(error);
return res.status(500).json({
title: 'An error occurred',
status: 500,
error: error
});
}
console.log('Message', info.messageId, info.response);
});
return res.status(200).json({
message: 'Emailed successfully',
details: info
});
答案 2 :(得分:0)
我们知道nodejs的请求和响应是流的,你可以在发送响应流后做一些事情,这样响应时间会减少,其他的事情在向客户端发送响应后会异步继续。
您可以成功向客户端发送响应,然后您可以调用发送邮件功能。