【发布时间】:2021-01-26 03:49:01
【问题描述】:
我正在编写一些测试,并希望能够以编程方式启动/停止我的 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 会关闭监听器。 -
这不是我的代码,但我不知道我可能会绑定哪些其他侦听器。您知道如何获取阻止进程退出的侦听器列表吗?
-
无法复制。调用
server.close()后,它按预期退出到 shell -
@andrey-sidorov,有趣!这实际上是“摘要”代码。我的代码实际上更长,我试图总结它。我还通过
tape模块运行测试。也许这是相关的。
标签: node.js