Когда я запускаю свое приложение Express на производстве, я хочу изящно закрыть сервер, когда его процесс будет убит (т.е. отправлен SIGTERM или SIGINT).
Вот упрощенная версия моего кода:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.json({ ping: true }));
const server = app.listen(3000, () => console.log('Running…'));
setInterval(() => server.getConnections(
(err, connections) => console.log('${connections} connections currently open')
), 1000);
process.on('SIGTERM', shutDown);
process.on('SIGINT', shutDown);
function shutDown() {
console.log('Received kill signal, shutting down gracefully');
server.close(() => {
console.log('Closed out remaining connections');
process.exit(0);
});
setTimeout(() => {
console.error('Could not close connections in time, forcefully shutting down');
process.exit(1);
}, 10000);
}
Когда я запустил его и вызываю URL-адрес http://localhost: 3000/ в браузере, оператор журнала в функции setInterval будет печатать "1 соединение в настоящее время открыто", пока я фактически не закрою окно браузера. По-видимому, даже закрытие вкладки будет оставаться открытым.
Итак, я убил свой сервер, нажав Ctrl + C, он запустится в таймаут и распечатает "Не удалось закрыть соединения" через 10 секунд, продолжая печатать "1 соединение открыто".
Только если я закрою окно браузера, прежде чем убить процесс, я получаю сообщение "закрыть оставшиеся соединения".
Что мне здесь не хватает? Каков правильный способ изящного закрытия Express-сервера?