2013-01-13 39 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未定义来崩溃。我希望服务器可以继续运行,并在遇到错误时正常报告错误。

如何实现的呢?我试过的try-catch但没有帮助我:(

+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需要在使用之前进行定义。

1 - 你真正想要什么,这是防止进程退出,可以通过处理uncaughtException(documentation)事件进行处理:

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 - 我会电子书籍使用try {}赶上(E ){}在您的代码,例如:

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处理程序上解析错误。

4-请注意,节点process会在未来被替换domain

5-我宁愿使用一个框架像express,不是做这个东西。

6-推荐演讲:StackOverflow - NodeJS best practice for exception handling

+0

1是错的,2是异步代码错误,4是错误的,因为进程将与域互补,而域现在也可以工作 –

+0

@BenjaminGruenbaum 1为什么?进一步解释+它实际上起作用并防止应用程序崩溃。 2作者从不说他需要处理异步代码上的解析异常。 4域是不稳定版本,节点文档明确说“使用域INSTEAD OF过程” –

+0

谢谢汤姆... 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/

使用这种方法必须尝试,抓住你的块旁边。