gpt4 book ai didi

node.js - 如何以编程方式停止 Node.js HTTP 服务器以使进程退出?

转载 作者:IT老高 更新时间:2023-10-28 23:10:35 25 4
gpt4 key购买 nike

我正在编写一些测试,并希望能够以编程方式启动/停止我的 HTTP 服务器。一旦我停止 HTTP 服务器,我希望启动它的进程退出。

我的服务器是这样的:

// file: `lib/my_server.js`

var LISTEN_PORT = 3000

function MyServer() {
http.Server.call(this, this.handle)
}

util.inherits(MyServer, http.Server)

MyServer.prototype.handle = function(req, res) {
// code
}

MyServer.prototype.start = function() {
this.listen(LISTEN_PORT, function() {
console.log('Listening for HTTP requests on port %d.', LISTEN_PORT)
})
}

MyServer.prototype.stop = function() {
this.close(function() {
console.log('Stopped listening.')
})
}

测试代码如下:

// file: `test.js`

var MyServer = require('./lib/my_server')
var my_server = new MyServer();

my_server.on('listening', function() {
my_server.stop()
})

my_server.start()

现在,当我运行 node test.js 时,我得到了我期望的 stdout 输出,

$ node test.js
Listening for HTTP requests on port 3000.
Stopped listening.

但我不知道如何让 node test.js 产生的进程退出并返回到 shell。

现在,我(抽象地)理解 Node 会一直运行,只要它正在监听的事件有绑定(bind)的事件处理程序。为了让 node test.jsmy_server.stop() 时退出到 shell,我需要取消绑定(bind)某些事件吗?如果是这样,哪个事件和来自什么对象?我尝试通过从中删除所有事件监听器来修改 MyServer.prototype.stop() 但没有运气。

最佳答案

几个月来我一直在寻找这个问题的答案,但我从未见过不使用 process.exit 的好答案。对我来说很奇怪,这是一个如此简单的请求,但似乎没有人对此有一个好的答案,或者似乎理解在不退出进程的情况下停止服务器的用例。

我相信我可能偶然发现了一个解决方案。我的免责声明是我偶然发现了这一点;它并没有反射(reflect)出对实际情况的深刻理解。所以这个解决方案可能不完整,或者可能不是唯一的方法,但至少它对我来说是可靠的。为了停止服务器,你需要做两件事:

  1. 在每个打开的连接的客户端调用 .end()
  2. 在服务器上调用.close()

这是一个示例,作为“磁带”测试套件的一部分:

test('mytest', function (t) {
t.plan(1);

var server = net.createServer(function(c) {
console.log("Got connection");
// Do some server stuff
}).listen(function() {
// Once the server is listening, connect a client to it
var port = server.address().port;
var sock = net.connect(port);

// Do some client stuff for a while, then finish the test

setTimeout(function() {
t.pass();
sock.end();
server.close();
}, 2000);

});

});

两秒后,进程退出,测试成功结束。我还在打开多个客户端套接字的情况下对此进行了测试;只要你结束所有客户端连接,然后在服务器上调用 .close() 就可以了。

关于node.js - 如何以编程方式停止 Node.js HTTP 服务器以使进程退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17958618/

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