node.js - nodemailer sendEmail 不在 Node.js 中等待
问题描述
当我向我的端点发出请求时,只有在发送电子邮件时才需要获得成功的响应!否则,它应该抛出一个错误:
myendpoint.js
router.post("/", upload.none(), async (req, res) => {
try {
let body = JSON.parse(req.body.contact);
await getDb("messages").insertOne({
name: body.name,
email: body.email,
phone: body.phone,
subject: body.subject,
message: body.message,
});
await sendEmail(body);
res.send(
JSON.stringify({
success: true,
msg: "Message has been sent successfully",
})
);
} catch (err) {
res.send(JSON.stringify({ success: false, msg: err }));
}
});
发送电子邮件.js
const sendEmail = async function (props) {
const transporter = nodemailer.createTransport({
service: process.env.EMAIL_SERVICE,
host: process.env.EMAIL_HOST,
auth: {
user: process.env.EMAIL_FROM,
pass: process.env.EMAIL_PASS,
},
});
const mailOptions = {
from: process.env.EMAIL_FROM,
to: process.env.EMAIL_TO,
name: props.name,
email: props.email,
phone: props.phone,
subject: props.subject,
text: props.message,
};
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
throw new Error("Message did Not send!");
}
});
};
问题出现在“等待 sendEmail(body);”之前 结束,我得到错误,我得到“消息已成功发送”,然后服务器崩溃!我错过了什么?
解决方案
在此处检查来自 nodemailer 的文档功能sendMail
如果未设置回调参数,则该方法返回一个 Promise 对象。Nodemailer 本身并不在内部使用 Promises,但为了方便起见,它会将返回值包装到 Promise 中。
const sendEmail = async function (props) {
const transporter = nodemailer.createTransport({
service: process.env.EMAIL_SERVICE,
host: process.env.EMAIL_HOST,
auth: {
user: process.env.EMAIL_FROM,
pass: process.env.EMAIL_PASS,
},
});
const mailOptions = {
from: process.env.EMAIL_FROM,
to: process.env.EMAIL_TO,
name: props.name,
email: props.email,
phone: props.phone,
subject: props.subject,
text: props.message,
};
// remove callback and function sendMail will return a Promise
return transporter.sendMail(mailOptions);
};
推荐阅读
- java - 邮递员“状态”:415,“错误”:“不支持的媒体类型”,
- python - 自动化上面的功能,所以我不必每次都写一个额外的术语
- python - 将 manim TextMobjects 组合成一个动画对象?
- matlab - Matlab:设置 ButtonDownFcn 会在悬停时禁用默认数据提示功能
- css - 带有关闭按钮的纯基于 CSS 的下拉菜单
- python - 如何通过 Pyserial 将 g 代码命令发送到 pcb 打印机?
- python - Django模型根据另一个字段更新计算字段
- int - varints 如何占用更少的空间?
- json - Nginx json 日志在 Elasticsearch (+ Kibana) 中被 Fluentd 错误解析
- javascript - 如何在两个数字之间的范围内动态创建不同的步长