Node. js 이상 처리 중 domain 모듈 의 사용 방법 을 분석 합 니 다.
process.on('uncaughtException', function (err) {
console.log('Error: %s', err.message);
});
setTimeout(function (fn) {
fn();
});
Error: undefined is not a function
전역 이상 을 포착 할 수 있 는 곳 이 있 지만 대부분의 이상 에 대해 서 는 가능 한 한 빨리 포착 하고 결과 에 따라 코드 의 실행 경 로 를 결정 하고 싶 습 니 다.다음 HTTP 서버 코드 를 예 로 들 겠 습 니 다.
function async(request, callback) {
// Do something.
asyncA(request, function (err, data) {
if (err) {
callback(err);
} else {
// Do something
asyncB(request, function (err, data) {
if (err) {
callback(err);
} else {
// Do something
asyncC(request, function (err, data) {
if (err) {
callback(err);
} else {
// Do something
callback(null, data);
}
});
}
});
}
});
}
http.createServer(function (request, response) {
async(request, function (err, data) {
if (err) {
response.writeHead(500);
response.end();
} else {
response.writeHead(200);
response.end(data);
}
});
});
이상 코드 는 요청 대상 을 비동기 함수 에 맡 긴 후 처리 결과 에 따라 응답 을 되 돌려 줍 니 다.여기에 반전 함 수 를 사용 하여 이상 을 전달 하 는 방안 을 채택 하 였 기 때문에 async 함수 내부 에 몇 개의 비동기 함수 가 더 호출 되면 코드 는 위 에 있 는 이 괴상 한 모양 이 된다.코드 를 예 쁘 게 하기 위해 서, 우 리 는 요청 을 처리 할 때마다 domain 모듈 을 사용 하여 하위 영역 (JS 하위 실행 환경) 을 만 들 수 있 습 니 다.하위 필드 에서 실행 되 는 코드 는 이상 을 임의로 던 질 수 있 으 며, 이러한 이상 은 하위 필드 대상 의 error 사건 을 통 해 통일 적 으로 캡 처 할 수 있 습 니 다.따라서 상기 코드 는 다음 과 같이 개조 할 수 있다.
function async(request, callback) {
// Do something.
asyncA(request, function (data) {
// Do something
asyncB(request, function (data) {
// Do something
asyncC(request, function (data) {
// Do something
callback(data);
});
});
});
}
http.createServer(function (request, response) {
var d = domain.create();
d.on('error', function () {
response.writeHead(500);
response.end();
});
d.run(function () {
async(request, function (data) {
response.writeHead(200);
response.end(data);
});
});
});
이 를 통 해 알 수 있 듯 이, 우 리 는. create 방법 으로 하위 영역 대상 을 만 들 었 고,. run 방법 을 통 해 하위 영역 에서 실행 해 야 할 코드 의 입구 점 에 들 어 갔다.한편, 자 역 에 있 는 비동기 함수 리 셋 함 수 는 이상 을 포착 할 필요 가 없 기 때문에 코드 는 단번에 살 이 많이 빠 졌 다.
함정 은 process 대상 의 uncaughtException 사건 을 통 해 전역 이상 을 포착 하 든, 하위 대상 의 error 사건 을 통 해 하위 영역 이상 을 포착 하 든, NodeJS 공식 문서 에서 이상 을 처리 한 후 즉시 프로그램 을 다시 시작 하 는 것 을 강력 히 권장 합 니 다.공식 문서 에 따 르 면 이상 이 발생 한 후 프로그램 은 불확실 한 운행 상태 에 있 으 며, 즉시 종료 하지 않 으 면 프로그램 에 심각 한 메모리 누 출 이 발생 할 수도 있 고, 이상 하 게 표 현 될 수도 있다.
하지만 여 기 는 사실 을 밝 혀 야 합 니 다.JS 자체 의 throw. try. catch 이상 처리 체 제 는 메모리 누 출 을 초래 하지 않 고 프로그램의 실행 결 과 를 예상 치 못 하 게 하지 않 습 니 다. 그러나 NodeJS 는 저장 되 어 있 는 JS 가 아 닙 니 다.NodeJS 에 있 는 대량의 API 내 부 는 C / C + + 로 이 루어 지기 때문에 NodeJS 프로그램의 실행 과정 에서 코드 실행 경 로 는 JS 엔진 내부 와 외부 로 오 가 고 JS 의 이상 던 지기 메커니즘 은 정상 적 인 코드 실행 절 차 를 중단 시 켜 C / C + 부분의 코드 가 이상 하 게 나타 나 메모리 누 출 등 문 제 를 초래 할 수 있 습 니 다.
따라서 uncaughtException 이나 domain 을 사용 하여 이상 을 캡 처 합 니 다. 코드 실행 경로 에 C / C + 부분 코드 가 포함 되 어 있 을 때 메모리 누 출 여부 등 이 확인 되 지 않 으 면 이상 을 처리 한 후 프로그램 을 다시 시작 하 는 것 이 좋 습 니 다.try 문 구 를 사용 하여 이상 을 포착 할 때 일반적으로 JS 자체 의 이상 을 포착 하 므 로 항소 문 제 는 걱정 하지 않 아 도 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.