2012-11-10 4 views
11

Node.js 및 Express에 응용 프로그램이 있습니다. 나는 그것에 대한 테스트를 작성해야합니다. Express 응용 프로그램 오류를 처리하는 데 문제가 있습니다. 이 How do I catch node.js/express server errors like EADDRINUSE?을 찾았지만 나에게 도움이되지 않습니다. 왜 그런지 모르겠습니다. expressApp.listen()이 실행되는 동안 발생할 수있는 오류 (EADDRINUSE, EACCES 등)를 처리하려고합니다.Node.js Express 응용 프로그램 시작 오류 처리

express = require('express') 
listener = express() 

#doesn't work for me 
listener.on('uncaughtException', (err) -> 
    #do something 
) 

#doesn't work too 
listener.on("error", (err) -> 
    #do something 
) 

#this works, but it caughts all errors in process, I want only in listener 
process.on('uncaughtException', (err) -> 
    #do something 
) 

listener.listen(80) #for example 80 to get error 

아이디어가 있으십니까?

+0

'listener.on '오류'... '이 작동합니다 :

listener.listen이 실제로 무엇을
listener.listen(80).on('error', function(err) { }); 

는 HTTP 서버를 생성하고 수신 대기 호출입니다. 그 라인이 존재하더라도 정상적인 스택 트레이스와 크래쉬를 수행합니까? – loganfsmyth

+0

예, 이렇게하면 'listener.listen (80)' 스택 추적을 인쇄하고 충돌합니다.'listener.on'오류 ', ...'가있는 경우에도 이 경우 오류가 발생하지 않을 수 있으며이 오류는 처리되지 않습니다. 그러나 그것은 단지 가정 일뿐입니다. –

답변

20

우선 expressJS는 uncaughtException 이벤트를 발생시키지 않으므로 프로세스가 작동하므로 코드가 작동하지 않는 것은 놀라운 일이 아닙니다.

대신 process.on('uncaughtException',handler)을 사용하십시오. 옵션으로,

app.configure(function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

이 기능은 클라이언트에 오류 메시지를 반환

다음으로, expressJS 이미 같이,이 목적을 위해이 제공하는 미들웨어 기능을 사용하는 것입니다 오류 처리의 표준 방법을 제공합니다 스택 트레이스이며, connectJS errorHandler에 문서화되어 있습니다.

(ErrorHandler를 실제로 connectJS의 일부입니다 만 expressJS에 의해 노출되어 있습니다.)

기존 ErrorHandler를 제공하는 행위는 사용자의 요구에 충분한 소스가 connectJS's errorHandler middleware에 위치하지 않고 쉽게 수정 될 수있는 경우 귀하의 필요에 맞게.

var myErrorHandler = function(err, req, res, next){ 
    ... 
    // note, using the typical middleware pattern, we'd call next() here, but 
    // since this handler is a "provider", i.e. it terminates the request, we 
    // do not. 
}; 

을 그리고 설치 : 물론, 오히려이 함수를 직접 수정하는 것보다

는이 작업을 수행하기 위해 "올바른"방법은 같이 출발점으로 connectJS 버전을 사용, 자신 만의 ErrorHandler를 만드는 것입니다

app.configure(function(){ 
    app.use(myErrorHandler); 
}); 

가 잘 작성된 튜토리얼 filterprovider 미들웨어 및 How To Write Middleware for Connect/Express의 connectJS의 아이디어에 대한 설명은 Just Connect it, Already를 참조하십시오으로 expressJS로.

이러한 도움을 찾을 수 있습니다 : 마지막으로

+0

+1, 아주 좋은 철저한 답변! – Menztrual

+0

자세한 설명을 해주셔서 감사합니다. 어쨌든 유용 할 것입니다. 웹 요청이 처리되는 동안 오류를 처리 할 필요가 없습니다. 나는 서버를 생성하고 app.listen (...)을 호출하는 동안 필요하다. 이제 Express에서 미들웨어가 아니라 Node.js 오류 처리가 필요하다는 것을 알았습니다. 내 경우에는 process.on ('uncaughtException', handler)을 사용할 수 있습니다. –

+0

@Piane_Ramso, 그렇다면 네 자신의 이벤트 핸들러를'process.on ('uncaughtException')에 추가하는 것은 확실히 방법이다. 궁금한 점이 있다면 [node.cc] (https://github.com/joyent/node/blob/master/src/)의 1739 번 라인 (또는 근처)에있는 "잡히지 않은"예외를 처리하는 기본 코드가 있습니다. node.cc) –

57
에서 찾을 수 있습니다

이 트릭을 수행해야합니다

app.listen = function(){ 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
}; 
+10

이것은 가장 간단하고 정확한 대답이고 그것은 upvotes가 없다는 것이 믿을 수 없다! 트릭은 webServer 객체가 app.listen에 의해 반환된다는 것을 이해하는 것입니다. (error, function (err)) { if (err.errno())}}}}}}}}}}} === 'EADDRINUSE') { console.log ('포트 사용 중'); else { console.log (오류); } }}); ''' –

+0

코드가 제대로 작동하지 않는다고 생각합니다. app.listen 노드를 호출하는 경우 이미 http.createServer를 생각하고 있거나 기본적으로 기본 app.listen() 메서드를 재정의하고 거기에 고유 한 코드로 재정의하는 중입니까? – PositiveGuy

+0

코드의 첫 번째 줄은 사용해야하는 것이고, 그 밖의 모든 것은 그 이유에 대한 설명입니다. –

관련 문제