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

时间:2016-12-14 08:25:16

标签: javascript node.js http

当事件循环为空时,

Node.js程序终止。如果我使用http模块并创建一个没有任何回调的服务器添加到事件循环中,程序将被终止:

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

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

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

那么即使我没有向事件循环添加任何内容,listen方法如何保持进程运行?它是否为事件循环添加了一些东西?它是如何与它相互作用的?

2 个答案:

答案 0 :(得分:2)

这里有两件事:

如果您查看有关server.listen(...)的Node.js文档,请在第一行说明:

  

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

  

此功能是异步的。服务器绑定后,   “倾听”事件将被发出......

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

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

答案 1 :(得分:-1)

此处的“答案”实际上根本无法回答问题。真正的解释是引用,Node的事件循环使用它来跟踪异步操作以及它是否可以关闭进程。

在此处更详细地回答:https://stackoverflow.com/a/51571024/8182008