节点uncaughtException处理程序内的异步代码

时间:2018-08-02 18:50:37

标签: node.js email asynchronous exception

我有一个节点应用程序(使用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');

上面的代码可以作为一个独立的应用程序正常工作,但是如果我将其复制到我的代码库中,它将无法正常工作。代码已执行,但我没有收到电子邮件(大概是应用程序在完成发送之前就死了)。因此,在我的环境中肯定有其他事情正在阻止它工作。我会继续挖掘。

1 个答案:

答案 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);
   });
});