我在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毫秒之后,这些连接仍然会出现。
我该如何解决?
答案 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
参数)。这意味着只有在出现错误时才会设置超时,而不是在请求成功完成时设置超时。