2013-07-26 3 views
4

타사 라이브러리를 사용하고 있습니다. 어떤 노드가 오류 처리를 위해 노드 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); 
}); 

이제 기능의 문제라고하기를 여러 번 해결된다. 그러나 최종 콜백은 결코 호출되지 않습니다.

노드의 동작을 어떻게 처리합니까?

제 3 자의 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); 
}); 

노드에서 이러한 사례를 전달하는 가장 좋은 방법은 무엇입니까?

+0

isCalled 수정이 작동하지 않는 이유는 무엇입니까? 설정은 어디입니까? 콜백이 호출되면 설정되지 않습니까? – Murukesh

답변

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

이 방법이 그것이 당신의 핸들러에 의해 체포 될 오류이며, 오류가 주까지 반송 될 경우 레벨과 무한 루프에 잡히지 않습니다.