【发布时间】:2017-12-21 13:56:37
【问题描述】:
在基于 NodeJS 6.10.2/SailsJS 0.12.13 的 JavaScript 应用程序中,几个月以来我遇到了一个奇怪的错误行为。
在 Sails 控制器中,我尝试检索文字对象的属性:
console.log(someObject.someProperty);
console.log("I am still here!");
但是,就我而言,someObject 是未定义的。所以,我希望得到一个错误,比如“无法读取未定义的属性 someProperty”。 - 然后要么 Node.js 完全停止,要么继续运行代码(使用下一个 console.log)。
相反,代码在该点停止执行,我收到一个奇怪的警告:“(node:4822) 警告:检测到可能的 EventEmitter 内存泄漏。添加了 11 个关闭侦听器。使用emitter.setMaxListeners() 增加限制。”然而,这个错误发生的频率是不可预测的。一些东西只有一次,一些东西紧接着大约 20 次。
我发现它与是否已经有回应的问题有某种联系。考虑以下几点:
mySailsControllerFunction: function(req, res) {
console.log(someObject.someProperty);
console.log("I am still here!");
res.json({"foo":"dahoo"});
}
这将导致Sending 500 ("Server Error") response: ReferenceError: someObject is not defined - 正是我所期望的。
但是,现在我首先发送一些响应,然后尝试访问我不存在的属性,将代码变成:
mySailsControllerFunction: function(req, res) {
res.json({"foo":"dahoo"});
setTimeout(function () {
console.log("Yeah!");
console.log(someObject.someProperty);
console.log("I am still here!");
},1000);
}
然后我常常一无所获:“是的!”显示,但之后什么都没有。事件侦听器错误有时存在,有时不存在。很奇怪。
此外,奇怪的是,这个问题似乎与 Sails 开始以来经过的时间有关。我将您在上面看到的代码放在 Sails 控制器函数中,该函数在客户端重新连接后立即调用。然后我玩弄了超时值,重新启动了 Sails 服务器几次。结果:如果我将超时设置为 1 秒,在 5 次测试中的 4 次中,我将获得正确的错误行为。 10 秒内大约是 50%,30 秒内错误将始终被忽略,没有任何控制台输出。
但是,如果我将测试代码放在 Sails 控制器之外,我总是会得到 Node.js 的正确错误行为。所以,我很确定这是 Sails 的错误行为,而不是 Node。
【问题讨论】:
-
如果没有更多上下文,很难判断发生了什么。例如,如果该代码在 Promise 链中运行,则可能是由于编码错误,错误被吞没了。这与一些奇怪的错误处理相结合(“添加了 11 个关闭侦听器” 看起来很奇怪)。
-
在上面查看我的编辑
-
更改 eventEmitter 限制后观察到什么行为?
-
老实说,我不知道具体在哪里做。我自己没有在这里设置任何事件监听器。这是由 Sails 以某种方式完成的。
标签: javascript node.js sails.js