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提前中断了控制流。

这里真正错误的是,试图通过在那里写入来模拟异步异常!

遗憾的是,这种尝试并不能代表我在整个代码库中遇到的实际错误。

server.listen是异步的。尝试

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

相关内容

最新更新