`server.listen()`如何保持节点程序运行

Node.js程序在事件循环为空时被终止。 如果我使用http模块创build一个没有任何callback的服务器被添加到事件循环,程序终止:

 const http = require('http'); const server = http.createServer(); 

但是,如果我添加listen ,程序将继续运行:

 const http = require('http'); const server = http.createServer(); server.listen(5155); 

那么,即使我不向事件循环添加任何东西, listen方法如何使进程继续运行? 它是否增加了一些事件循环? 它如何与它交互?

这里有两件事情:

如果你看看关于server.listen(…)的Node.js文档,它在第一行说:

开始接受指定端口和主机名的连接…

和:

这个function是asynchronous的。 当服务器已被绑定,“聆听”事件将被发射…

这本身不足以回答你的问题。 那么让我们来看一下代码。

listen()方法( https://github.com/nodejs/node/blob/master/lib/net.js#L1292 )最终调用self._listen2()方法。 在最后一行:

 process.nextTick(emitListeningNT, this); 

https://github.com/nodejs/node/blob/master/lib/net.js#L1276

这是一个callback:

 function emitListeningNT(self) { // ensure handle hasn't closed if (self._handle) self.emit('listening'); } 

https://github.com/nodejs/node/blob/master/lib/net.js#L1285 )。

这样,除非node.js检测到错误或其他停止条件,它将继续运行。