繁体   English   中英

Node.js域中的多个错误事件调用

[英]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);
}

导致问题中提到的问题有两点:

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

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

2. 这可能是Node.js中的错误。 通过http.createRequest()创建请求可将活动域的一个或两个其他引用添加到域堆栈中。 这导致onDomError被多次调用。 首先,通过堆栈上的最高域,引发的错误将传递到堆栈上的下一个域,该域再次调用onDomError ,依此类推……嗯,这很难解释;)请参阅节点问题#8429节点问题有关更多详细信息,请参见GitHub上的#8429

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM