Как правильно обрабатывать ошибки в узле с доменом?
Я использую стороннюю библиотеку. Который использует узел 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);
});
})
}
Таким образом, если есть ошибка, она будет перехвачена вашим обработчиком, и ошибка будет отправлена обратно на главный уровень и не попадет в бесконечный цикл.