【发布时间】:2021-12-29 10:20:42
【问题描述】:
我创建了一个传输类来发送电子邮件:
export class MailTransporter {
receiver: string;
private transporter: Transporter;
constructor(receiver: string) {
this.receiver = receiver;
this.transporter = this.getTransporter();
}
private getTransporter() {
const { MAIL_USERNAME: user, MAIL_PASSWORD: pass, MAIL_HOST: host, MAIL_PORT: port } = process.env;
if (!user || !pass || !host || port) {
// NEXT LINE THROWS AN ERROR
throw new Error('Specify MAIL_USERNAME, MAIL_PASSWORD, MAIL_HOST and MAIL_PORT in .env');
}
const transporter = nodemailer.createTransport({
host,
port: Number(port),
secure: true,
auth: {
user,
pass,
},
});
return transporter;
}
public async sendMail(formValues: string) {
const values: FormValues = JSON.parse(formValues);
const message: SendMailOptions = {...};
await this.transporter.sendMail(message, (err, info) => {
if (err) {
throw err;
}
console.log('Email successfully sent. Info:\n', info);
});
}
}
并从handler 函数中调用sendMail 函数:
export default async function Handler(req: NextApiRequest, res: NextApiResponse) {
const { body } = req;
try {
const response = await MessageTransporter.sendMail(body); //MessageTransporter is an instance of MailTransporter
res.status(200).json({ success: true, message: 'OK' });
} catch (error) {
res.json({ success: false, message: 'Could not send the message' });
}
}
但是MailTransporter 中抛出的错误没有在Handler 中捕获,而是在我的控制台 中收到错误
在我的浏览器中,我的 POST 请求出现 500 错误。
你能解释一下那里发生了什么吗?为什么在handler 的try catch 中没有捕获到错误?
另外,我对 js 类有点陌生,所以如果你对类设计有什么要说的,请说。
【问题讨论】:
-
无论实例是构造,都会引发该错误,而这不是您所显示的。
-
对
getTransporter的调用在MailTransporter的构造函数中,因此您应该在为MessageTransporter创建实例的调用站点上检查它。 -
啊,我在实例构造中调用 getTransporter。说得通。感谢你们。 @NalinRanjan 如果你留下一个,我会接受你的回答
标签: javascript typescript error-handling