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

5
当事件循环为空时,Node.js程序会终止。如果我使用http模块创建服务器,并且没有添加任何回调函数到事件循环中,那么程序将被终止。
const http = require('http');
const server = http.createServer();

然而,如果我添加listen,程序将继续运行:
const http = require('http');
const server = http.createServer();
server.listen(5155);

那么 listen 方法如何使进程保持运行,即使我没有向事件循环中添加任何内容?它是否会向事件循环中添加内容?它如何与事件循环交互?


https://github.com/nodejs/node/blob/master/lib/net.js#L1337 的内容是与编程相关的。 - zerkms
请参见:https://dev59.com/H2sz5IYBdhLWcg3wuKa6#7699579 - Paul
@zerkms, Paulpro 谢谢,我会去探索。 - Max Koretskyi
1个回答

9

这里有两个要点:

如果你查看Node.js关于server.listen(...)的文档,第一行写道:

开始在指定的端口和主机名上接受连接...

以及:

此函数是异步的。当服务器已绑定时, 'listening'事件将被触发...

但这本身还不足以回答你的问题。所以让我们看一下代码。

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)

这是一个回调函数:

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检测到错误或其他停止条件,否则它将持续运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接