node.js - 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}`);
}) ;
推荐阅读
- scala - 在包含 Scala Spark 数据帧中的数组的列中过滤数组的长度
- scilab - Runge-Kutta 二阶,波变换,求解保留方程*
- jquery - 基础下拉菜单不工作在角度
- angularjs - 显示和隐藏在带有“dirPagination”(AngularJS)的 ng-repeat 中
- php - Laravel 从上传中获取保存文件的路径
- wordpress - wordpress 奇怪地翻译了字段
- java - 课堂上的情况?
- php - 同时插入数据和检索主键。通过 1 提交 只有 PHP、MYSQL
- javascript - 如何替换 setTimeout 函数?
- javascript - 在第二个下拉菜单(jQuery)中过滤结果时创建“所有”数据类别