【问题标题】:How to do proper error handling in node with domain?如何在带域的节点中进行正确的错误处理?
【发布时间】:2013-09-18 04:02:18
【问题描述】:

我正在使用第三方库。它使用节点domain 进行错误处理。 如果传递给该第三方库的回调函数有任何错误,最终会多次调用我的回调。

示例代码为:

var startFunction = function (callback) {
  //Call thirdParty function and wait for response
  thirdPartyFunction(function (error, data) {
    console.log("Called with");
    console.log(arguments);
    //Assume there is an error in my callback function
    setTimeout(function () {
      dd
      callback.apply(null);
    }, 2000);
  });
}
 //ThirdParty function don't modify anything here
var thirdPartyFunction = function (callback) {
  var Domain = require("domain");
  var d = require('domain').create();
  d.on('error', function (er) {
    console.log("hi");
    callback.apply(null, er);
  });
  d.run(function () {
    setTimeout(function () {
      callback.apply(null, [null, "Hello"]);
    }, 1000);
  });
};
startFunction(function () {
  console.log("Got response")
});

我们将此错误报告给第三方库,他们已经修改了源代码。喜欢:

d.on('error', function (er) {
  if (isCalled == false) {
    isCalled = true;
  } else {
    return;
  }
  console.log("hi");
  callback.apply(null, er);
});

现在函数被多次调用的问题已经解决了。但是最终的回调永远不会被调用。

如何处理节点的这种行为?

如果第三方库修改那里的代码,它会导致应用程序崩溃。放置一个包装域也无济于事。

d.on('error', function (er) {
  if (isCalled == false) {
    isCalled = true;
  } else {
    throw new Error("Getting called");
    return;
  }
  console.log("hi");
  callback.apply(null, er);
});

在节点中处理此类情况的最佳方法是什么?

【问题讨论】:

  • 为什么 isCalled 修复不起作用?它在哪里设置?不是回调调用的时候设置的吗?

标签: node.js node.js-domains


【解决方案1】:

您可以将自己的域侦听器附加到回调函数,如下所示:

    var startFunction = function (callback) {
  //Call thirdParty function and wait for response
  thirdPartyFunction(function (error, data) {
    var d1 = require('domain').create();
    d1.on('error', function(er){
      console.log("bye");
      callback.apply(null, er);
    });
    d1.run(function () {
      console.log("Called with");
      console.log(arguments);
      //Assume there is an error in my callback function
      setTimeout(function () {
        dd
        callback.apply(null);
      }, 2000);
  });
    })
}

这样,如果出现错误,它将被您的处理程序捕获,并将错误发送回主级别,而不是陷入无限循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多