MST

星途 面试题库

面试题:JavaScript在Node中如何捕获SIGTERM信号并优雅关闭服务

请用JavaScript代码展示在Node.js应用中,如何捕获SIGTERM信号,并在捕获到该信号时,优雅地关闭一个HTTP服务器,确保所有正在处理的请求完成处理。
45.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello World\n');
});

server.listen(3000, () => {
    console.log('Server running on port 3000');
});

let connections = [];
server.on('connection', (socket) => {
    connections.push(socket);
    socket.on('close', () => {
        connections = connections.filter(c => c!== socket);
    });
});

process.on('SIGTERM', () => {
    console.log('Received SIGTERM. Closing server...');
    server.close(() => {
        console.log('Server closed. Waiting for connections to finish...');
        if (connections.length === 0) {
            console.log('All connections closed. Exiting.');
            process.exit(0);
        } else {
            const closeConnections = () => {
                if (connections.length === 0) {
                    console.log('All connections closed. Exiting.');
                    process.exit(0);
                } else {
                    connections[0].end();
                    connections.shift();
                    setTimeout(closeConnections, 100);
                }
            };
            closeConnections();
        }
    });
});