0

subscribe to redis を使用してメッセージを受信し、接続されたクライアントに送信するかなり単純な Node.JS アプリケーションがあります。さらに、サブスクライブ メソッドを使用して 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 接続のプールが作成されます。

そのため、コードを変更して、アプリの起動時に 1 回呼び出すようにしtransport、電子メールを送信する必要があるたびにオブジェクトを再利用します。

于 2013-10-09T13:19:19.280 に答える