阅读下面的内容以获得实际解释
我希望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}`);
}) ;