客户端退出浏览器后自动关闭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
相关产品推荐
相关产品推荐

