【发布时间】:2014-09-16 10:23:28
【问题描述】:
以下代码运行一个域并创建一个 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);
}
【问题讨论】:
-
我还在 GitHub 上的 Node.js 存储库中创建了一个问题:github.com/joyent/node/issues/8378
标签: javascript node.js events error-handling