我在我的Windows机器上使用Nodejs。问题是Nodejs总是在错误时终止进程,例如空的Mysql插入语句。
所以在生产时间,没有手动错误处理,怎么能阻止NodeJ退出?
示例代码:
app.post('/api/accounts',function(req,res){
pool.getConnection(function(error,connection){
connection.query('insert into accounts set ?',req.body,function(err,results){
if (err) {
throw err ;
} else {
console.log(results) ;
}
});
});
console.log('post received') ;
console.log(req.body);
});
想象一下,我发布了一个空的req.body。 nodejs会在出错时退出
\node_modules\mysql\lib\protocol\Parser.js:77
throw err; // Rethrow non-MySQL errors
^
是否可以在节点中配置某些内容以仅显示错误但不退出?
答案 0 :(得分:2)
在解释员抛出未处理的异常之后继续执行并不是一件好事(正如Ginden在他的回答中所说的那样) - 任何事情都可能发生并且可以证明如果以后出现错误,可以通过在代码出现意外错误之后停止清理过程来轻松打开任何类型的漏洞。
你可以明智地为unhandledException
添加一个事件处理程序,就像Ginden的回答所指出的那样,然而,看起来你似乎正在使用快递,它实际上会更有意义在中间件发生时处理错误,而不是根据您的代码使用throw
。
将throw err;
替换为return next(err);
,这应该意味着请求将落入下一组中间件,然后应该处理错误,执行一些日志记录,告诉用户,无论您想要什么要做。
app.use(function(err, req, res, next) {
// Maybe log the error for later reference?
// If this is development, maybe show the stack here in this response?
res.status(err.status || 500);
res.send({
'message': err.message
});
});
答案 1 :(得分:0)
不要试图阻止进程关闭。如果抛出错误,任何都可能发生。
Warning: Using 'uncaughtException' correctly
请注意,'uncaughtException'是异常处理的粗略机制,仅用作最后的手段。该事件不应用作On Error Resume Next的等效项。未处理的异常本身意味着应用程序处于未定义状态。尝试在未正确恢复异常的情况下恢复应用程序代码可能会导致其他无法预料和不可预测的问题。 将不会捕获从事件处理程序中抛出的异常。相反,该过程将以非零退出代码退出,并且将打印堆栈跟踪。这是为了避免无限递归。 在未被捕获的异常之后尝试正常恢复可能类似于在升级计算机时拔出电源线 - 十分之九没有任何事情发生 - 但是第10次,系统被破坏。
Domain module: don't ignore errors
就如何在JavaScript中运行的本质而言,几乎从来没有任何方法可以安全地“拾取你离开的地方”,不会泄漏引用,或者创建其他类型的未定义的脆弱状态。 响应抛出错误的最安全方法是关闭进程。当然,在普通的Web服务器中,您可能打开了许多连接,因为错误是由其他人触发而突然关闭它们是不合理的。 更好的方法是向触发错误的请求发送错误响应,同时让其他人在正常时间内完成,并停止侦听该工作程序中的新请求。