【发布时间】:2020-07-05 00:15:38
【问题描述】:
我正在写一个身份验证。 node.js 网络服务器的路由。我正在使用 Express,它运行良好。
我遇到的问题是在发生错误时调用 sendMail() 函数。目前,我只是在测试路径中抛出一个新错误。
throw new Error('testing...');
因为我使用的是 express-async-errors 模块,所以如果路由中发生错误,程序流程会转到我的错误中间件函数。
效果很好。
但是在这个错误中间件函数中,我调用了我的 sendMail() 函数,它立即失败,给我与上面相同的错误:'testing...'
const sendEmail = require('../email/sendEmail');
// error middleware function
async function error(err, req, res, next) {
const wasSent = await sendEmail('my-user-name@gmail.com', 'Error', err);
console.log(wasSent);
// http 500 - internal server error
res.status(500).send("Something unexpected happened. Our team has been notified.");
}
结果是我在下面的 sendMail() 函数中的 catch 块被调用。 我做错了什么?
这是我的发送邮件功能:
const nodemailer = require("nodemailer");
const striptags = require('striptags');
const config = require('config');
async function sendEmail(to, subject, content) {
try {
// create reusable transporter object using the default smtp transport
let transporter = nodemailer.createTransport({
host: config.get('emailHost'),
port: config.get('emailPort'),
secure: config.get('emailSecure'), // true for 465, false for other ports
auth: {
user: config.get('emailUsername'),
pass: config.get('emailPassword'),
},
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: config.get('emailFrom'), // sender address
to: to, // list of receivers
subject: subject,
text: striptags(content), // plain text body
html: content, // html body
});
// e.g. message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
//console.log("message sent: %s", info.messageId);
return true;
}
catch(ex) {
console.log("error: sendEmail() invocation failed;", ex);
return false;
}
}
module.exports = sendEmail;
【问题讨论】:
-
ex的console.log说什么?我相信striptags(content)可能不起作用,因为content可能是Error对象而不是字符串。Error对象可能需要先序列化为字符串 -
我刚刚想通了......它似乎是这一行: const wasSent = await sendEmail('my-user-name@gmail.com', 'Error', err);跨度>
-
将“err”对象作为字符串发送会导致问题。
标签: javascript node.js express