[英]Multiple error event calls in Node.js domain
以下代码运行一个域并创建一个http请求。 该请求尝试连接到未知主机,该主机发出请求的错误事件。 请求错误处理程序通过抛出错误将错误传递给域错误处理程序。
以我的理解,请求错误事件应该用ECONNREFUSED发出一次 ,但它应该发出两次 :首先是用ECONNREFUSED,然后是ECONNRESET。
但是,当我不使用域时,代码将按预期工作(只有一个错误)。 使用域时相同,但不要抛出错误。 当我使用普通的EventEmitter对象而不是http请求时,它也可以工作。
谁能向我解释这种行为,并告诉我如何在域内修复错误处理?
// The problem only occurs inside a domain
var dom = require("domain").create();
dom.addListener("error", onDomError);
dom.run(run);
// // If we don't use a domain everything works
// run();
function run() {
console.log("run");
// The following code should throw _one_ error, but throws two instead
var req = require("http").request({
'hostname': "localhost",
'port': 1337,
'method': "GET",
'path': "/error"
});
req.addListener('error', onError);
// // This code works as excpected
// var EventEmitter = require('events').EventEmitter;
// var emitter = new EventEmitter();
// emitter.addListener("error", onError);
// emitter.emit("error", "some error");
// Throwing the error seems to cause the error
function onError(error) {
console.log("onError");
throw error;
}
// If we don't throw the error everthing works
// function onError(error) {
// console.log("onError");
// console.log(error)
// }
}
function onDomError(error) {
console.log("onDomError");
console.log(error);
}
导致问题中提到的问题有两点:
onError
处理程序。 1.这是一个简单的编码错误。 Node.js域隐式处理该域内创建的对象的所有错误事件。 添加另一个错误事件处理程序调用onDomError
导致onDomError
被调用两次。 一次直接来自域,另一次来自附加事件处理程序。
2.
这可能是Node.js中的错误。
通过http.createRequest()
创建请求可将活动域的一个或两个其他引用添加到域堆栈中。 这导致onDomError
被多次调用。 首先,通过堆栈上的最高域,引发的错误将传递到堆栈上的下一个域,该域再次调用onDomError
,依此类推……嗯,这很难解释;)请参阅节点问题#8429和节点问题有关更多详细信息,请参见GitHub上的#8429 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.