Node.js /如何处理连接泄漏?

时间:2015-02-05 07:52:39

标签: javascript node.js

我在Node.js中编写了一个服务器应用程序。

当我lsof -p 10893(10893是我的Node.js应用程序的pid)时,我明白了:

node    10893 root   19u  IPv4 (num) 0t0    TCP ip-X.X.X.X->ip-X-X-X.X:45403 (ESTABLISHED)
node    10893 root   19u  IPv4 (num) 0t0    TCP ip-X.X.X.X->ip-X-X-X.X:58416(ESTABLISHED)

当我重新启动应用程序时,此连接将保持并且永不关闭。

我在node.js中有以下代码,据我所知,应该处理这个问题:

app.use(function(err, req, res, next) {
    res.setTimeout(120000);
    res.status(500).send('Unexpected error');
});

但即使在120000毫秒之后,这些连接仍然会出现。

我该如何解决?

1 个答案:

答案 0 :(得分:2)

很确定这是一个Keep-Alive问题。有关详细信息,请参阅this question及其答案,但要点是:

res.set("Connection", "close");

如果您希望所有连接都采用该行为,请将其作为路由/路由器上方的中间件添加:

app.use(function (req, res, next) {
    res.set("Connection", "close");
    next();
});

另外,如果你想让套接字本身超时,那就有点棘手了:

var http = require('http');
var express = require('express');

var app = express();
var svr = http.createServer(app);

svr.on('connection', function (socket) {
    socket.setTimeout(120000, function () {
        this.end();
    });
});

// other middleware / routes here

app.use(function(err, req, res, next) {
    res.status(500).send('Unexpected error');
});

svr.listen(PORT);

修改

注意到你的函数是一个错误处理程序中间件(由于存在err参数)。这意味着只有在出现错误时才会设置超时,而不是在请求成功完成时设置超时。