Экспресс-обработка ошибок или домен?

#node.js #express #error-handling #uncaught-exception

#node.js #экспресс #обработка ошибок #неперехваченное исключение

Вопрос:

Я создаю приложение в nodejs и express. Кто-нибудь может помочь мне понять разницу между следующими фрагментами кода:

   var app = express();
  app.use(function(err, req, res, next){
  console.error(err);
  res.render('home.ejs', {message:'Something broke!'});
  });
 

и

  var domain = require('domain');
 var d = domain.create();
 d.on('error', function(err) {
 console.error(err);
 res.render('home.ejs', {message:'Something broke!'});
 });
 

Являются ли эти две части кода альтернативными? Если да, то какой из них более надежен, чтобы избежать сбоя приложения при работе?

Ответ №1:

Экспресс обертывает каждый function (req, res, next) {} из них в try / catch. Который улавливает много ошибок, но не асинхронные ошибки. Домены улавливают асинхронные ошибки. Однако обнаружение ошибки и ее обработка — это две разные вещи.

Если вы выполните следующую ошибку (иначе d.on('error', next); ), это приведет к переходу на промежуточное ПО express error, как и в вашем первом примере.

Поэтому вместо того, чтобы думать о express vs domains, подумайте о try / catch vs domains. Экспресс следует использовать для обработки ошибки в любом случае.

Ответ №2:

Мне удалось добиться асинхронной обработки ошибок при работе с доменами с помощью этого промежуточного программного обеспечения:

 function(req,res,next){
    var d = domain.create();

    d.on('error',next)

    d.run(function(){
        next();
    })
}
 

В настоящее время я тестирую его на своих серверах, но для меня он выглядит хорошо :). Я также создал модуль npm. Вы можете взглянуть на это:

npmjs.org — экспресс-асинхронная ошибка

Надеюсь, это поможет. 🙂