Node. js 이상 처리 중 domain 모듈 의 사용 방법 을 분석 합 니 다.

4013 단어
NodeJS 는 domain 모듈 을 제공 하여 비동기 코드 의 이상 처 리 를 간소화 할 수 있 습 니 다.이 모듈 을 소개 하기 전에 우 리 는 먼저 '역' 의 개념 을 이해 해 야 한다.쉽게 말 하면 하나의 도 메 인 은 JS 운영 환경 입 니 다. 운영 환경 에서 이상 이 포착 되 지 않 으 면 전체 이상 으로 던 져 집 니 다.NodeJS 는 process 대상 을 통 해 전역 이상 을 캡 처 하 는 방법 을 제공 합 니 다. 예제 코드 는 다음 과 같 습 니 다.

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 자체 의 이상 을 포착 하 므 로 항소 문 제 는 걱정 하지 않 아 도 됩 니 다.

좋은 웹페이지 즐겨찾기