我们希望将node.js用于高度动态的项目。传统上,我们使用Java,当遇到未处理的异常时,会抛出错误,但Web应用程序(通常)会继续提供其他请求。
但是,对于节点,相同的方案会导致进程终止。我不想想如果我们将这个系统部署到生产系统并且整个服务器由于未处理的异常而崩溃会发生什么。
我想知道是否有教程/工具/等来帮助解决处理异常的问题。例如,有没有办法添加全局最后手段类型的异常?
答案 0 :(得分:3)
process.on('uncaughtException', function (err){
console.error(err)
})
答案 1 :(得分:3)
如上所述[{3}},您会发现error.stack
提供了更完整的错误消息,例如导致错误的行号:
process.on('uncaughtException', function (error) {
console.log(error.stack);
});
答案 2 :(得分:1)
您应该使用Node.js domains:
响应抛出错误的最安全方法是关闭进程。当然,在普通的Web服务器中,您可能打开了许多连接,因为错误是由其他人触发而突然关闭它们是不合理的。
更好的方法是向触发错误的请求发送错误响应,同时让其他人在正常时间内完成,并停止侦听该工作中的新请求。
链接页面有示例代码,我在下面稍作简化。它的工作原理如上所述。您可以以退出时自动重新启动的方式调用服务器,或use the worker pattern from the full example。
var server = require('http').createServer(function(req, res) {
var d = domain.create();
d.on('error', function(er) {
console.error('error', er.stack);
try {
// make sure we close down within 30 seconds
var killtimer = setTimeout(function() {
process.exit(1);
}, 30000);
// But don't keep the process open just for that!
killtimer.unref();
// stop taking new requests.
server.close();
// try to send an error to the request that triggered the problem
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!\n');
} catch (er2) {
// oh well, not much we can do at this point.
console.error('Error sending 500!', er2.stack);
}
});
// Because req and res were created before this domain existed,
// we need to explicitly add them.
d.add(req);
d.add(res);
// Now run the handler function in the domain.
d.run(function() {
// your application logic goes here
handleRequest(req, res);
});
});