我有一个节点应用程序(使用Typescript 2.8.1的8.11.1版),它使用uncaughtException
钩子捕获未捕获的异常,如下所示:
process.on('uncaughtException', (err) => {
await sendEmail(recipient, subject, body);
});
我正在处理程序中调用异步方法来发送电子邮件,并且代码不起作用。看来节点进程在异步调用完成之前就死了,而且我再也没有收到电子邮件。
您似乎可能无法在此处理程序内成功使用异步方法。 documentation并未直言不讳,但它暗示了这一点
'uncaughtException'的正确用法是执行同步 清理分配的资源
我不尝试恢复操作或执行任何时髦的操作。我要做的就是发送并发送电子邮件,说明系统崩溃了。我找不到任何可以同步发送电子邮件的库,因此我对如何处理此邮件感到迷茫。
我已经看到一个建议,将数据同步写入文件(或数据库),并进行一些外部处理,以查询该文件的存在并发送电子邮件(如果存在)。我想那行得通,但是它很hacky。有更好的解决方案吗?
好吧,在运行更多测试之后,看起来您实际上可以从uncaughtException
处理程序内部运行异步代码。以下作品:
const mailer = require('nodemailer');
process.on('uncaughtException', async err => {
const transport = mailer.createTransport({
service: 'gmail',
auth: {
user: 'someone@email.com',
pass: 'abc'
}
});
const mailOptions = {
from: 'someone@email.com',
to: 'someone.else@email.com',
subject: 'hi',
text: 'there'
};
transport.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
}
else {
console.log(info);
}
});
});
throw new Error('boom');
上面的代码可以作为一个独立的应用程序正常工作,但是如果我将其复制到我的代码库中,它将无法正常工作。代码已执行,但我没有收到电子邮件(大概是应用程序在完成发送之前就死了)。因此,在我的环境中肯定有其他事情正在阻止它工作。我会继续挖掘。
答案 0 :(得分:0)
我不知道您使用哪个库发送电子邮件以及使用哪个版本的Node js,但是如果您使用的Node JS版本大于7,则可以使用async / await并按以下方式发送电子邮件
var mailgun = require('mailgun-js')({apiKey: api_key, domain: domain});
process.on('uncaughtException', async (err) => {
var data = {
from: 'User <me@samples.mailgun.org>',
to: 'serobnic@mail.ru',
subject: 'ERROR MESSAGE',
text: `Caught exception: ${err}\n`,
};
var body = await mailgun.messages().send(data);
console.log(body);
});
// using callback - supported for all versions
process.on('uncaughtException', (err) => {
var data = {
from: 'User <me@samples.mailgun.org>',
to: 'serobnic@mail.ru',
subject: 'ERROR MESSAGE',
text: 'Caught exception:' + err,
};
mailgun.messages().send(data, function (err, body) {
console.log(body);
});
});