2016-04-21 45 views
0

我在我的windows机器上使用Nodejs。问题是Nodejs总是在错误时终止进程,例如空的Mysql插入语句。Nodejs出错,应该防止还是不?

那么在生产时间内,如果没有手动错误处理,怎么能防止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

向我们展示一些您正在谈论的示例代码。 –

+0

@John Zwinck:我更新了帖子,感谢您的关注 –

回答

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 
    }); 
}); 
+0

实际上我想知道,所以我学会了如何防止停止使用下一个...,非常感谢 –

0

不要试图阻止进程关闭。如果错误被抛出,任何东西都可能发生。

Warning: Using 'uncaughtException' correctly

注意“uncaughtException”是打算异常处理粗机制,只能作为最后的手段。该事件不应等同于“错误继续下一步”。未处理的异常本质上意味着应用程序处于未定义状态。尝试恢复应用程序代码而不正确地从异常恢复可能会导致额外的无法预料的和不可预知的问题。 从事件处理程序中抛出的异常不会被捕获。相反,该进程将以非零退出码退出,堆栈跟踪将被打印。这是为了避免无限递归。 尝试正常恢复未捕获的异常后,可能类似于升级计算机时拔出电源线 - 十次中有九次没有任何反应 - 但第10次系统损坏。

Domain module: don't ignore errors

通过的抛在JavaScript中是如何工作的本质,几乎从来没有以任何方式安全地“拿起您离开的地方”,没有泄漏引用,或创造一些其他种类的不确定脆性状态。 响应抛出的错误的最安全方法是关闭该过程。当然,在一个普通的Web服务器中,你可能会打开很多连接,并且由于其他人触发错误而突然关闭这些连接是不合理的。 更好的方法是向引发错误的请求发送错误响应,同时让其他人在正常时间内完成,并停止监听该工作人员中的新请求。