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

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

  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!'});
 });

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


person k88074    schedule 23.06.2014    source источник


Ответы (2)


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

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

Поэтому вместо того, чтобы думать о экспресс-доменах и доменах, подумайте о try/catch и доменах. Express следует использовать для обработки ошибки в любом случае.

person generalhenry    schedule 23.06.2014

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

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

    d.on('error',next)

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

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

npmjs.org — express-async-error

Надеюсь это поможет. :)

person JakubKnejzlik    schedule 09.12.2014