Как правильно обрабатывать ошибки в узле с доменом?

Я использую стороннюю библиотеку. Который использует узел 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")
});

Мы сообщили об этой ошибке сторонним lib, и они изменили исходный код. Подобно:

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);
});

Каков наилучший способ передачи таких дел в узле?

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);
  });
    })
}

Таким образом, если есть ошибка, она будет перехвачена вашим обработчиком, и ошибка будет отправлена ​​обратно на главный уровень и не попадет в бесконечный цикл.

Другие вопросы по тегам