Я изо всех сил пытаюсь осуществить изящное завершение работы в NodeJS.
Мое определение грациозно: после получения SIGINT сервер прекращает принимать новые соединения, завершает все активные запросы, затем немедленно убивает все соединения keepalive и процесс завершается.
const express = require('express');
// const enableDestroy = require('server-destroy'); // approach 2
const app = express();
const port = 5000;
app.get('/', (req, res) => {
setTimeout(() => {
res.send('Hello World!')
// req.connection.destroy(); // approach 3
}, 5000)
});
const server = require('http').createServer(app)
server.listen(port, () => console.log(`HelloWorld listening on port ${port}`))
// enableDestroy(server) // approach 2
process.on('SIGINT', () => {
console.log('\nSIGINT received...')
// server.destroy() // approach 2
server.close(() => { console.log('Successfully closed all connections!') })
});
Как проверить: Запустите сценарий выше, нажмите http://localhost:5000/ в браузере, завершите сценарий выше, используя CTRL + C, пока запрос еще выполняется.Ожидаемое поведение: запрос обслужен, скрипт завершается, как только он обслужен.
Попытка:
- godaddy / terminus Результат: делаетничто не убивает соединения keepalive, server.close занимает вечно (по-видимому, 120 секунд - значение времени ожидания запроса по умолчанию).
- server-destroy (я прокомментировал точные строки). Результат : убивает текущие запросы, server.close () мгновен, но запрос не выполняется.
- вызывает req.connection.destroy () после каждого подключения (я прокомментировалточная линия). Результат : ничего не делает, server.close () длится вечно (120 секунд).