0

我有一个相当简单的 Node.JS 应用程序,它使用订阅 redis 来接收消息,然后将这些消息发送给连接的客户端。此外,我还使用 subscribe 方法向 Node.JS 传递命令以向我们的用户发送电子邮件。

一切正常,但内存使用量每天都在增长,直到达到 1.1GB(在 linux 上使用命令 top),然后所有进一步的电子邮件发送都失败并显示错误消息:

{ [Error: spawn ENOMEM] code: 'ENOMEM', errno: 'ENOMEM', syscall: 'spawn' }

那是从哪里来的?源代码相当简单:

连接的客户:

io.sockets.on('connection', function (socket) {
    nClients++;
    console.log("Number of clients connected " + nClients);
    socket.on('disconnect', function () {
        nClients--;
        console.log("Number of clients remaining " + nClients);
    });
});

接收要发送给客户端的消息

cli_sub.on("message",function(channel,message) {
    if(nUseDelay==1) {
        oo = JSON.parse(message);
        ablv_last_message[oo[0]["base"]+"_"+oo[0]["alt"]] = message;
    } else {
        io.sockets.emit('ablv', message);
    }
});

向客户发送电子邮件

cli_email.on("message",function(channel,message) {
    var transport = nodemailer.createTransport("sendmail");

    oo = JSON.parse(message);

    var mailOptions = {
        from: email_sender,
        bcc: oo["bcc"],
        to: oo["recipient"],
        subject: oo["subject"],
        html: oo["text"]
    } 
    try {
        transport.sendMail(mailOptions);
    } catch(err) {
        console.log(err);
    }
});


setInterval(function() {
        Object.keys(ablv_last_message).forEach( function(key) {
        io.sockets.emit('ablv', ablv_last_message[key]);
    });
    ask_last_message = [];
}, 5000);
4

1 回答 1

2

当您调用时,nodemailer.createTransport您正在创建一个旨在在您的应用程序生命周期内重复使用的 SMTP 连接池。

因此,将您的代码更改为在应用启动时调用一次,然后在transport每次需要发送电子邮件时重用该对象。

于 2013-10-09T13:19:19.280 回答