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

客户端退出浏览器后自动关闭Node.js服务的实现方案咨询

NodeJS 自动关闭空闲服务实现代码

核心逻辑

  • 维护全局活跃连接计数器,跟踪所有存活的TCP连接
  • 连接数归0时启动超时倒计时,期间有新连接接入就重置倒计时
  • 倒计时结束无任何连接时,主动关闭HTTP服务并退出进程

完整实现代码

const http = require('http');

// 配置项:无连接自动关闭阈值,单位毫秒,这里设为30秒
const AUTO_SHUTDOWN_DELAY = 30 * 1000;

// 全局状态
let activeConnections = 0;
let shutdownTimer = null;

// 创建HTTP服务
const server = http.createServer((req, res) => {
  // 你的业务逻辑写这里,示例返回hello world
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});

// 监听新TCP连接接入
server.on('connection', (socket) => {
  activeConnections++;
  console.log(`新连接接入,当前活跃连接数:${activeConnections}`);

  // 有新连接,清空待执行的关闭定时器
  if (shutdownTimer) {
    clearTimeout(shutdownTimer);
    shutdownTimer = null;
    console.log('取消自动关闭任务');
  }

  // 监听连接关闭事件
  socket.on('close', () => {
    activeConnections--;
    console.log(`连接断开,当前活跃连接数:${activeConnections}`);

    // 所有连接都断开,启动自动关闭倒计时
    if (activeConnections === 0) {
      console.log(`所有连接已断开,${AUTO_SHUTDOWN_DELAY/1000}秒后自动关闭服务`);
      shutdownTimer = setTimeout(() => {
        console.log('无连接超时,开始关闭服务');
        server.close(() => {
          console.log('服务已关闭,退出进程');
          process.exit(0);
        });
      }, AUTO_SHUTDOWN_DELAY);
    }
  });
});

// 启动服务监听3000端口
server.listen(3000, () => {
  console.log('服务已启动,监听端口3000');
});

注意事项

  • 这里直接监听HTTP服务的connection事件比在每个请求中获取request.connection更准确,避免同一个TCP连接复用发起多个HTTP请求时重复计数的问题
  • 代码中默认使用HTTP协议自带的keep-alive超时规则,如果需要自定义连接空闲超时时间,可以调用socket.setTimeout(你的超时时间)设置
  • 关闭服务时调用server.close()会先停止接受新连接,等所有正在处理的请求完成后再触发回调,不会中断正在执行的业务逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:00:02