2015-11-11 2 views
1

Я использую pm2 для управления процессом в моем приложении expressjs express (работает в режиме кластера).pm2 не перезапускает работника при возникновении явной ошибки

У нас было 2 вида обработчика ошибок

  • ПЕРВЫЙ: 'uncaughtException' будет обрабатываться с

    process.on('uncaughtException', function(err){}); 
    

На самом деле, я не объявить обработчик, как это дело того, чтобы позволить pm2 обнаруживает умершего работника в этом случае, поэтому перезапустите умершего работника автоматически.

  • ВТОРАЯ: экспресс-обработчик ошибок, я имею в виду ошибка будет перенаправлен выразить обработчик ошибок, не uncaughtException обработчик, обработчик ошибок, как показано ниже

    app.use(function(err, req, res, next) {}) 
    

Я также не заявить об этом обработчик ошибок для той же цели, что и uncaughtException. Но pm2 не перезапускает узел в этом случае.

Есть идеи по поводу этой проблемы? Большое спасибо

+0

Есть ли необходимость перезапуска вашего приложения? Если я не ошибаюсь, приложение все еще работает и может отвечать на новые запросы. Поскольку исключение было пойманным, вы должны ответить в явном обработчике ошибок с некоторой хорошей страницей, говорящей о том, что возникла проблема, а не позволять браузеру браузера на время ожидания. – Molda

+0

Да, когда ошибка поймана экспресс-обработчиками ошибок, сервер не будет разбит. Но исключение означает, что в вашем коде есть некоторые проблемы, и, возможно, сервер окажется в нестабильном состоянии, и вы не можете знать, что он может отреагировать на запрос в будущем. Я думаю, в этом случае мы должны перезапустить этот узел. – thelonglqd

+0

Затем вы можете попробовать process.exit (0) в обработчике ошибок после того, как вы зарегистрируете случившееся. pm2 должен перезапустить его. – Molda

ответ

2

При обнаружении ошибок с помощью экспресс-обработчика ошибок или даже события «uncaughtException» процесс все еще запущен, поэтому pm2 не перезапустит его. Если вы хотите пм2 перезапустить после каждого исключения, я хотел бы предложить что-то вроде этого:

process.on('uncaughtException', function(e) { 
     console.log('An error has occured. error is: %s and stack trace is: %s', e, e.stack); 
     console.log("Process will restart now."); 
     process.exit(1); 
    }) 

То же самое относится к экспресс-обработчик ошибок. Когда мы выполним метод process.exit, процесс завершится, и pm2 перезапустит его.

 Смежные вопросы

  • Нет связанных вопросов^_^