2013-06-30 2 views
9

나는 노드 콜 서버를 사용하여 서버로 HTTP 호출을 실행합니다. 나쁜 일이 발생하면 서버를 정상적으로 종료하는 권장 방법이 있습니까? 어떻게 든 서버를 계속 실행해야합니까?Nodejs/express, 정상적으로 종료

I.E. 잡히지 않는 예외에서 서버가 멈 춥니 다. 저는 이것이 연결된 클라이언트를 죽이고 응답을 돌려주지 않을 것이라고 생각합니다.

내가해야 : 나는 서버가 죽는 (다음 다시 시작) 할 수 있도록하기 전에 모든 HTTP 연결

  1. 가 완료 될 때까지 대기합니다.
  2. 아니면 서버가 죽지 않도록 시도해야합니까?

이 적절한가요?

process.on('exit', function() { 
    console.log('About to exit, waiting for remaining connections to complete'); 
    app.close(); 
}); 

이 경우 서버를 정의되지 않은 상태로 둠으로써 서버가 나머지 연결을 계속 끝내는 오류가 발생했을 수 있습니다.

오류를 계속 처리 할 수있는 좋은 방법이 있습니까? 아니면 서버를 종료하고 다시 시작해야합니까?

답변

6

처리되지 않은 예외가 있으면 아무 것도하지 마십시오. 서버를 죽게하십시오.

일반적으로 경로 처리기가 예외를 throw하면 Express는이를 catch하고 HTTP 500을 클라이언트에 반환합니다. 익스프레스가 예외를 잡았으므로 서버가 다운되지 않습니다.

일반적으로 콜백 내부에서 예외가 발생하는 경우 서버를 종료시키는 현상이 발생합니다.

콜백은 자연스럽게 Express 라우터 호출 스택 외부에서 실행되므로 특정 요청과 연결할 수 없습니다. 그러나 이러한 상황을 방지 할 수 있습니다

app.get('/foo', function(req, res, next) { 
    db.query(..., function(err, r) { 
     try { 
      throw new Error(); 
     } catch(ex) { 
      next(ex); 
     } 
    }); 
}); 

익스프레스 'next 함수는 첫 번째 인수로 오류를합니다. 오류 인수 next를 호출하면, 아마 과잉이다 try/catch모든 포장, 경로 처리를 중지하고 error handler을 찾아, 아니면 그냥 물론 500

를 반환합니다; 대부분의 경우 실제로 예외가 발생하지 않습니다. 을 알고있는 경우을 던지면됩니다. 그렇지 않으면 예외를 삼켜 서 일관성없는 상태를 디버그하는 것이 매우 어려울 수 있습니다.

예기치 않은 예외가 발생하면 응용 프로그램이 정의되지 않은 상태라는 것을 기억하십시오. 문제 요청이 완료되지 않고 앱이 다시 시작되지 않을 수도 있습니다. 또는 다른 이상한 일이 발생할 수 있습니다. (데이터베이스 문제였습니까? 파일 시스템? 손상된 메모리입니까?)

이러한 종류의 상황은 진단하기가 매우 어렵고 디버그가 훨씬 적습니다. 빠르고 안전하게 실패하고 서버를 재시작하고 재시작하는 것이 안전하고 논란의 여지가 없습니다. 그렇습니다. 연결된 모든 클라이언트는 끊어 질 것입니다. 그러나 단순히 다시 시도하는 것만으로도 충분합니다.

가용성이 걱정되면을 사용하여 여러 개의 (일반적으로 CPU 코어 수) 서버 프로세스가 실행되고 하나의 충돌로 전체 사이트가 다운되지는 않습니다.

+1

위대한 설명입니다. 내가 아직도 명확하지 않은 한 가지. '예기치 않은 예외가 발생하면 응용 프로그램이 정의되지 않은 상태임을 기억하는 것이 중요합니다. 문제 요청이 완료되지 않고 앱이 다시 시작되지 않을 수도 있습니다. ' 마치 앱을 호출해서는 안되는 것처럼 소리가납니다.닫기(); 프로세스 '출구'에. 참된? – lostintranslation

+0

'process''exit' 핸들러에서'app.close()'를 호출하는 것은 무의미합니다 : [docs say] (http://nodejs.org/api/process.html#process_event_exit) * "메인 이벤트 루프는 'exit'콜백이 끝난 후에 더 이상 실행되지 않습니다. "* 즉, exit 이벤트는 함수가 반환 된 후에 프로세스 **가 종료 할 것임을 알려줍니다. 네트워크 청취자를 닫는 것은 다음 틱이 없기 때문에 무의미합니다. 들어오는 연결을 받아들이는 코드는 절대 실행할 기회가 없습니다. – josh3736

+0

끝내 주셔서 고마워요! – lostintranslation

5

NodeJS는 아무 일도 일어나지 않을 때 종료됩니다. http 서버가 연결 노드에서 대기하는 동안 실행중인 상태로 유지됩니다.

server.close([callback])

새로운 연결을 허용에서 서버를 중지하고 기존 연결을 유지합니다. 이 함수는 비동기식이며 모든 연결이 종료되고 서버가 close 이벤트를 내면 서버는 결국 입니다. 선택적으로, close 이벤트를 수신하기 위해 콜백을 전달할 수 있습니다.

이렇게하면 마지막 연결이 끝날 때까지 서버가 계속 실행되고 정상적으로 종료됩니다.

연결이 종료 될 때까지 기다리지 않으려면 남은 연결에서 socket.end() 또는 socket.destroy()을 사용할 수 있습니다.

process.on('exit', function() { 
    console.log('About to exit, waiting for remaining connections to complete'); 
    app.close(); 
}); 

노드가 존재하고 실제로 종료 노드를 말할 때이 기능을 실행해야


http://nodejs.org/api/net.html를 참조하십시오.

process.exit([code])

지정된 코드를 사용하여 프로세스를 종료 : 여기에 한 가지 방법 당신이 당신의 프로세스를 끝낼 수 있지만 정상적으로 끝나지 않을 것입니다. 생략 된 경우 exit는 의 '성공'코드 0을 사용합니다.

은 '실패'코드로 종료하려면 :

process.exit(1);1로 종료 코드 를 볼 노드를 실행 쉘.

내가이 도움이 되었으면 좋겠


http://nodejs.org/api/process.html

하세요!

관련 문제