如何确保NodeJS在错误请求后恢复?

我正在使用Express 4,Mongoose和MongoDB运行NodeJS应用程序。 然后,我得到了一个可能的机器人GET请求,其响应是404。通常,应用程序进行后,没有问题,但这次它看起来像冻结或停滞。 没有页面会加载在我的浏览器,虽然应用程序仍然在技术上运行。 重启后恢复正常。

在testproxy.php后,它只会发出一半的空行。

我知道有永远的模块,将重新启动您的应用程序,如果它崩溃,不知道这将有助于在这种情况下。

在这里输入图像描述

编辑:

在我的app.js(我在开发模式):

app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } 

它应该已经打印了500错误,但它不是因为它认为它处理了404错误,我不认为在这种情况下,下一个(err)曾经被解雇。

通常修复你真的需要有一些前台(如nodemon )或后台(如永远 )的守护进程,这将照顾你的服务器崩溃,并重新启动你的节点实例。

另一个需要注意的重要事情就是一旦处于未定义状态就立即终止进程。

例如,您可以添加以下中间件:

 var serverProcess; app.use(function(err, req, res, next) { // regular errors handler here // process further middleware if error can't be handled in the correct way next(err); }); app.use(function(err, req, res, next) { // close request connection req.connection.end(); // stop server process serverProcess.close(function() { //An unhandled exception means your application is in an undefined state. //Blindly resuming means anything could happen. process.exit(1); }); }); serverProcess = http.listen(httpPort, callback); 

您可以提供任何其他逻辑来杀死您的进程,但请记住,应用程序之外的某些内容应该处理这种情况并正确地重新启动服务器。

经过实验和研究发现:

 GET / -- ms -- GET / -- ms -- 

发生应用程序失去连接到MongoDB(杜)。 就在我的情况下,坏的请求和丢失数据库连接同时发生,不小心。

我正在使用Mongoose,所以可以做的是在callback中添加数据库重新启动和应用程序重新启动逻辑:

 mongoose.connection.on('disconnected', function () { console.log('Mongoose default connection disconnected'); });