#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 — экспресс-асинхронная ошибка
Надеюсь, это поможет. 🙂