gpt4 book ai didi

node.js - 如何立即关闭 Node.js http(s) 服务器?

转载 作者:IT老高 更新时间:2023-10-28 21:52:54 36 4
gpt4 key购买 nike

我有一个包含 http(s) 服务器的 Node.js 应用程序。

在特定情况下,我需要以编程方式关闭此服务器。我目前正在做的是调用它的 close() 函数,但这无济于事,因为它等待任何保持事件的连接首先完成。

因此,基本上,这会关闭服务器,但仅在至少 120 秒的等待时间之后。但我希望服务器立即关闭——即使这意味着中断当前处理的请求。

我做不到的就是简单

process.exit();

因为服务器只是应用程序的一部分,应用程序的其余部分应保持运行。我正在寻找的是概念上的东西,例如 server.destroy(); 或类似的东西。

我怎样才能做到这一点?

PS:连接的保持事件超时通常是必需的,因此减少此时间不是一个可行的选择。

最佳答案

诀窍是您需要订阅服务器的 connection 事件,该事件会为您提供新连接的套接字。您需要记住这个套接字,然后在调用 server.close() 之后直接使用 socket.destroy() 销毁该套接字。

此外,您需要监听套接字的 close 事件以将其从数组中移除,如果它自然离开,因为它的保活超时确实用完了。

我编写了一个小示例应用程序,您可以使用它来演示此行为:

// Create a new server on port 4000
var http = require('http');
var server = http.createServer(function (req, res) {
res.end('Hello world!');
}).listen(4000);

// Maintain a hash of all connected sockets
var sockets = {}, nextSocketId = 0;
server.on('connection', function (socket) {
// Add a newly connected socket
var socketId = nextSocketId++;
sockets[socketId] = socket;
console.log('socket', socketId, 'opened');

// Remove the socket when it closes
socket.on('close', function () {
console.log('socket', socketId, 'closed');
delete sockets[socketId];
});

// Extend socket lifetime for demo purposes
socket.setTimeout(4000);
});

// Count down from 10 seconds
(function countDown (counter) {
console.log(counter);
if (counter > 0)
return setTimeout(countDown, 1000, counter - 1);

// Close the server
server.close(function () { console.log('Server closed!'); });
// Destroy all open sockets
for (var socketId in sockets) {
console.log('socket', socketId, 'destroyed');
sockets[socketId].destroy();
}
})(10);

基本上,它所做的就是启动一个新的 HTTP 服务器,从 10 数到 0,然后在 10 秒后关闭服务器。如果没有建立连接,服务器会立即关闭。

如果一个连接已经建立并且它仍然是打开的,它就会被销毁。如果它已经自然死亡,则在那个时间点只打印一条消息。

关于node.js - 如何立即关闭 Node.js http(s) 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14626636/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com