如何在域中的节点做适当的error handling?

我正在使用第三方库。 哪个节点domain用于error handling。 如果传递给该第三方库的callback函数有任何错误,最终会多次调用我的callback函数。

示例代码是:

 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报告了这个bug,并修改了源代码。 喜欢:

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

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

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

如果第三方lib修改了代码,导致应用程序崩溃。 把一个包装的域名也没有帮助。

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

在节点中处理这种情况的最好方法是什么?

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

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

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