You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Server.close()无法按预期停止的问题解析

Node.js HTTP服务器4秒后未如期关闭的原因与解决方法

你的代码

var http = require('http');
var server = http.createServer(function (req,res) {
  res.end("Hello World") 
})

server.listen(5000);

setTimeout(() => {server.close() } ,4000);   // put anytime duration here 

问题原因

server.close()的作用不是立刻终止服务器,而是停止接收新的请求连接,但会等待所有已建立的活跃连接处理完成后,才会真正关闭服务器。

核心原因是HTTP/1.1默认开启的keep-alive机制:浏览器和服务器建立连接后,不会立刻断开,会保持一段时间(默认一般5秒)以便复用连接处理后续请求。当你在0到n秒持续操作时,这些保持的活跃连接会阻止服务器关闭——直到所有活跃连接都断开,服务器才会彻底停止。

你观察到的“闲置4秒后再次刷新,服务器在第29秒关闭”,是因为闲置时keep-alive连接超时断开,刷新请求会建立新连接,服务器处理完这个请求后,新连接的keep-alive计时开始,等这个连接超时断开后,服务器没有了活跃连接,才完成关闭流程。

解决方法

方法1:强制关闭所有活跃连接

通过监听服务器的connection事件记录所有连接,调用server.close()后主动销毁这些连接,实现立刻关闭:

var http = require('http');
var server = http.createServer(function (req,res) {
  res.end("Hello World") 
})

// 存储所有活跃的TCP连接
const activeConnections = new Set();

// 监听新连接,加入集合
server.on('connection', (conn) => {
  activeConnections.add(conn);
  // 连接关闭时从集合移除
  conn.on('close', () => {
    activeConnections.delete(conn);
  });
});

server.listen(5000);

setTimeout(() => {
  // 停止接收新连接
  server.close(() => {
    console.log('服务器已彻底关闭');
  });
  // 强制销毁所有活跃连接
  activeConnections.forEach(conn => {
    conn.destroy();
  });
}, 4000);

方法2:关闭响应的keep-alive

在响应头里设置Connection: close,让每个请求完成后立刻断开连接,这样服务器处理完最后一个请求后,就没有活跃连接了,server.close()就能顺利关闭:

var http = require('http');
var server = http.createServer(function (req,res) {
  // 告诉客户端请求完成后断开连接
  res.setHeader('Connection', 'close');
  res.end("Hello World") 
})

server.listen(5000);

setTimeout(() => {
  server.close(() => {
    console.log('服务器已关闭');
  });
}, 4000);

内容的提问来源于stack exchange,提问作者Brijesh Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:10:55