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

时间:2016-03-15 20:07:40

标签: node.js get freeze

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

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

我知道有一个永远的模块可以重新启动你的应用程序,如果它崩溃,不确定它会在这种情况下有用。

enter image description here

编辑:

在我的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错误,我不认为下一个(错误)在这种情况下被解雇。

2 个答案:

答案 0 :(得分:1)

通常要修复你确实需要一些前台(例如nodemon)或后台(例如forever)守护程序进程,它会照顾你的服务器崩溃并重新启动你的节点实例。

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

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

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);

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

答案 1 :(得分:0)

经过实验和研究后发现:

GET / -- ms --
GET / -- ms --
当应用程序失去与MongoDB(duh)的连接时,会发生

。就我而言,错误的请求和丢失的数据库连接同时发生,意外。

我使用的是Mongoose,所以可以做的是在回调中添加db restart和app restart逻辑:

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