我正在编写一些测试,并希望能够以编程方式启动/停止我的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只要有绑定的事件处理程序来监听它正在监听的事件,就会一直运行。为了使node test.js
能够在my_server.stop()
后退出到shell,我需要解除某些事件的绑定吗?如果是这样的话,是哪个对象的哪个事件需要解除绑定呢?我尝试修改MyServer.prototype.stop()
以从中删除所有事件侦听器,但没有成功。
test.js
没有生成新的进程。它只是创建了一个监听器实例。这确实是你的代码吗?因为我天真地认为my_server.stop
会关闭监听器。 - Joeprocess._getActiveHandles()
和process._getActiveRequests()
(也作为链接问题的答案发布)。 - Andrey Sidorov