【问题标题】:How does `server.listen()` keep the node program running`server.listen()` 如何保持节点程序运行
【发布时间】:2017-04-29 12:08:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: javascript node.js http


【解决方案1】:

这里有两件事:

如果您查看有关 server.listen(...) 的 Node.js 文档,它会在第一行显示:

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

和:

这个函数是异步的。绑定服务器后, '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 检测到错误或其他停止条件,否则它将继续运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多