首页 > 解决方案 > Node.js server.listening 标志始终为 false

问题描述

阅读下面的实际解释

我希望在……嗯……听的时候listening回来。true相反,false尽管文件另有说明,但我还是得到了。没有人提交错误报告,也没有人遇到这个问题,所以......是我!不是吗?

这段代码有什么问题?

"use strict";

const mod_net = require("net");
const server = mod_net.createServer((socket) => { /* ignore */ });

console.log(`BEFORE: ${server.listening}`);

server.listen(8000, "127.0.0.1");

console.log(`AFTER: ${server.listening}`);

输出是:

> BEFORE: false
> AFTER: false

实际说明

代码库相当大,我试图将每个 SO 策略减少到最少的代码,但为了好玩,让我们看一个更好的例子,说明我是如何搞砸自己的测试的。

我想要的是测试清理功能是否能正常工作,所以我故意throw在两行之间抛出了一个意图,并希望清理功能能够触发。

"use strict";

const mod_net = require("net");
const server = mod_net.createServer((socket) => { /* ignore */ });

process.on("exit", () => {

  console.log(`IN EXIT: ${server.listening}`);

  if (server.listening)
  {
    server.close();

    console.log("SEND BYE-BYE MESSAGE AND 'FIN' TO SOCKETS");
  }

  console.log("GRACEFUL SHUTDOWN");
});

server.listen(8000, "127.0.0.1");

throw new Error("Boom!");

输出是:

IN EXIT: false
GRACEFUL SHUTDOWN
/home/pid/dev/test.js:26
throw new Error("Boom!");
^

如您所见,server.listener仍然是false. 这就是 node.js 的预期正确行为,因为正如@AKX 的答案所示,它是异步的。server.listen()从来没有机会运行,因为在throw时间之前打破了控制流。

这里真正的问题是试图通过在其中编写异步异常来模拟它!

对我来说可悲的是,这种尝试并不代表我在完整代码库中遇到的实际错误。

标签: node.js

解决方案


server.listen是异步的。尝试

server.listen(8000, "127.0.0.1", () => {
    console.log(`AFTER: ${server.listening}`); 
}) ;

推荐阅读