运行没有错误:
const app = express();
const server = app.listen(3900, '0.0.0.0', () => {
console.log('listening...');
});
process.once('SIGINT', () => {
console.log('got SIGINT.')
setTimeout(() => {
console.log('ending process due to SIGINT + subsequent Timeout.')
process.exit(0);
}, 3000);
server.closeIdleConnections(); // <<<
server.closeAllConnections(); // <<<<
server.close(err => {
if (err) {
console.error(err);
}
console.log('closed server, and now shutting down due to SIGINT.')
process.exit(0);
});
});
但我的问题是 - 这是在结束现有连接/请求之前停止接受新连接的最佳方法吗?
“空闲”连接是如何定义的?
在您的代码中,您尝试处理 'SIGINT' 信号以正常关闭服务器。但是,方法 'server.closeIdleConnections()' 和 'server.closeAllConnections()' 不是标准 Express API 的一部分。相反,您应该使用 'server.close()' 停止接受新连接,然后等待现有连接完成,然后再关闭服务器。这是代码的更新版本:
javascript
const app = express();
const server = app.listen(3900, '0.0.0.0', () => {
console.log('listening...');
});
process.once('SIGINT', () => {
console.log('got SIGINT.');
server.close((err) => {
if (err) {
console.error(err);
process.exit(1);
}
console.log('closed server, and now shutting down due to SIGINT.');
process.exit(0);
});
});
此代码将通过关闭服务器并等待现有连接完成然后退出进程来正常关闭您的服务器。关于您关于“空闲”连接的问题,在 Express 等 Web 服务器的上下文中,空闲连接是指打开但不主动发送或接收数据的连接。 server.close() 方法将等待这些空闲连接完成,然后再关闭服务器。
在golang中,我们可以这样做:
s := &http.Server{
// ...
}
l, err := net.Listen("tcp", addr)
然后这样做:
if err := l.Close(); err != nil { // !! Stop listening for new connections
// err
}
if err := s.Close(); err != nil { // !! Close all current/existing connections
// err
}
第一个调用停止接受新连接,第二个调用关闭所有现有连接。将它们分开很好,但不知道如何使用 node.js 来做到这一点