2013-01-13 4 views
6

노드 js에 익숙하지 않습니다. 나는 간단한 HTTP 서버를 만들려고했다. 유명한 예를 따라 'Hello World!'를 만들었습니다. 서버를 설치합니다.노드 js 서버가 충돌하는 것을 막는 방법

var handleRequest = function(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 

require('http').createServer(handleRequest).listen(8080); 

console.log('Server started on port 8080'); 

이 코드를 실행하면 서버가 제대로 시작될 수 있습니다. 하지만 http://127.0.0.1:8080에 액세스하려고하면 res1이 정의되지 않은 오류가 발생하여 오류가 발생합니다. 서버를 계속 실행하고 오류가 발생하면 정상적으로 오류를보고하고 싶습니다.

어떻게 처리합니까? 나는 시도 - 캐치를 시도했지만 그것은 나에게 도움이되지 :(

+2

http://stackoverflow.com/a/8114990/435413 (autoreboot javascript) 또는 http://stackoverflow.com/questions/5999373/how-do-i-prevent-node-js-from-crashing- try-catch-doesnt-work (크래시 방지) – sod

+1

안녕하세요 Benjamin, 실수로 res1로 입력하여 오류가 발생했습니다. 내 질문은 서버를 크래시하지 않고 이러한 오류를 처리하는 방법에 관한 것입니다. – Goje87

답변

6

여기에 의견이 많이 있습니다. 우선, 예제 서버가 작동하려면 handleRequest를 사용하기 전에 정의해야합니다.

var handleRequest = function(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 
var server = require('http').createServer(handleRequest); 
process.on('uncaughtException', function(ex) { 
    // do something with exception 
}); 
server.listen(8080); 
console.log('Server started on port 8080'); 

2 내가 시도 {} 캐치 (예를 사용하는 recomment 것이다 : 종료 과정을 방해하는 당신이 실제로 원하는 것은

1은,의 uncaughtException (documentation) 이벤트 처리에 의해 처리 될 수) {} 코드에서, 같은 : 나는 예는 단지 예를 들어 실제 코드가 아닌이었다고 생각한다

var handleRequest = function(req, res) { 
    try { 
     res.writeHead(200); 
     res1.end('Hello, World!\n'); 
    } catch(e) { 
     res.writeHead(200); 
     res.end('Boo'); 
    } 
}; 

3이 방지 할 수있는 구문 분석 오류입니다. Exception catch 핸들러에서 구문 분석 오류가 발생하지 않아야하므로이 부분을 언급합니다.

3- 노드 process이 물건을보다, 차라리 express 같은 프레임 워크를 사용하는 것 domain

5와 미래에 대체 될 것입니다 유의하시기 바랍니다.

6 권장 강의 : 나는 귀하의 질문에 상세하지만 충돌에서 노드 서버 방지에 대한 질문의 제목을 목표로하고 있지 않다 StackOverflow - NodeJS best practice for exception handling

+0

1이 잘못되었습니다. 비동기 코드에 2가 잘못되었습니다. 프로세스가 도메인으로 보완되고 도메인도 이제 작동합니다. –

+0

@BenjaminGruenbaum 1 이유는 무엇입니까? 더 나아가 앱이 실제로 작동하고 앱이 다운되는 것을 방지하십시오. 2 저자는 비동기 코드에 대한 구문 분석 예외를 처리해야한다고 절대 말하지 않습니다. 4 도메인이 불안정한 버전이고 노드 문서가 명시 적으로 "프로세스 대신 도메인 사용" –

+0

감사합니다 Tom ... ponint 1이 (가) 나를 위해 일했습니다 ... 그리고 나는 여러분의 제안을 따를 것입니다. 나는 익스프레스 사용을 고려할 것이다. – Goje87

0

당신이 그것을 사용하기 전에 아마 당신은 handleRequest을 정의해야합니다 :

require('http').createServer(handleRequest).listen(8080); 

function handleRequest(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 

또는

var handleRequest = function(req, res) { 
    res.writeHead(200); 
    res1.end('Hello, World!\n'); 
}; 

require('http').createServer(handleRequest).listen(8080); 

그리고 당신은해야한다 res1도 존재하는지 확인하십시오.

+1

아니요, javascript는 자동으로 "var"문을 범위의 맨 위로 이동합니다. –

+1

안녕하세요 @ NULL, 예 ... handleRequest는 createServer 줄 위에 있어야합니다. 내 잘못이야. 나는 그것을 잘못 복사했다 (지금 질문을 업데이트한다). 이제 res1 오류가 발생했습니다. 오류의 원인을 알았습니다. 나는 그것을 우아하게 다루는 것에 대해 물어 보려고했다. – Goje87

+0

@BenjaminGruenbaum 네'handleRequest'가 정의되었지만'undefined'입니다. 이것은 다음과 같이 쓰는 것과 같습니다 :'var a; b (a) a = function() {...}' – andlrc

1

. DOMAIN을 사용하면 uncaughtException이 발생했을 때 서버가 중단되는 것을 막을 수 있습니다. 자세한 내용은

domain = require('domain'), 
d = domain.create(); 

d.on('error', function(err) { 
    console.error(err); 
}); 

은 블록을 시도 - 캐치해야한다이 방법을 사용하여 옆에

http://shapeshed.com/uncaught-exceptions-in-node/ 이동합니다.

관련 문제