【问题标题】:Multiple error event calls in Node.js domainNode.js 域中的多个错误事件调用
【发布时间】: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);
}

【问题讨论】:

标签: javascript node.js events error-handling


【解决方案1】:

两件事导致问题中提到的问题:

  1. 如果对象已由域管理,则无需添加 onError 处理程序。
  2. Node.js 可能会将活动域的其他引用添加到域堆栈。

1.这是一个简单的编码错误。 Node.js 域隐式处理在域内创建的对象的所有错误事件。添加另一个调用onDomError 的错误事件处理程序会导致onDomError 被调用两次。一次直接来自域,另一次来自附加事件处理程序。

2. 这可能是 Node.js 中的一个错误。 通过 http.createRequest() 创建请求会将活动域的一个或两个附加引用添加到域堆栈.这会导致onDomError 被多次调用。首先是堆栈上的最顶层域,然后抛出的错误将传递到堆栈上的下一个域,它再次调用onDomError,依此类推……嗯,很难解释;)见Node issue #8429和@ GitHub 上的 987654322@ 了解更多详情。

【讨论】:

    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2012-01-20
    • 1970-01-01
    • 2014-05-22
    • 2013-12-02
    相关资源
    最近更新 更多