Nodemailer - 如何处理enetunreach错误

时间:2016-12-13 11:32:03

标签: node.js error-handling nodemailer

我有一个nodejs应用程序,它使用nodemailer插件发送电子邮件。这种工作有99.99%的时间,但昨天应用程序在PM2日志中挂起了以下错误。

mod.mailer: Error: connect ENETUNREACH 2a00:1450:400c:c04::6c:465 - Local (:::0)

我没有找到关于此类错误的大量信息。完全可能的是网络连接中可能存在短暂的问题。下面是我写的用于传输电子邮件的模块的代码。我如何捕获此类错误并确保应用程序不会挂断,而是重试发送电子邮件。

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport(process.env.TRANSPORT);

function mail(options) {
    transporter.sendMail({
        from: process.env.SUBDIRECTORY + '\@' + process.env.HOST + '\ \<geolytix@gmail.com\>',
        to: options.to,
        subject: options.subject,
        text: options.text
    }, function (err, info) {
        if (err) {
            console.log('mod.mailer: ' + err);
        }
        console.log('mod.mailer: ' + info.response);
    });
}

module.exports = {
    mail: mail
};

1 个答案:

答案 0 :(得分:0)

该问题是内部软件包捕获,在出现网络问题时会弹出。 因此,要解决此问题,还必须将代码放入try-catch块中,然后递归调用函数

function mail(options) {
  try{
    transporter.sendMail({
        from: process.env.SUBDIRECTORY + '\@' + process.env.HOST + '\ \<geolytix@gmail.com\>',
        to: options.to,
        subject: options.subject,
        text: options.text
    }, function (err, info) {
        if (err) {
            console.log('mod.mailer: ' + err);
        }
        console.log('mod.mailer: ' + info.response);
    });
    
  } catch(err){
    console.log(err);
    mail(options)
  }
    
}

注意: 如果错误持续不断,这种技术还可能导致javascript无限期地堆积在自己身上,并吞噬内存,直到它们超过引擎的容量为止。

一种解决方案是对递归进行检查,如果达到一定限制,该递归将下降。