2013-11-14 2 views
1

В nodejs экспресс для обработки исключений, проверьте ERR в обратных вызовов, как:как обрабатывать исключения в одном месте в nodejs и выразить

if(err!==null){ 
    next(new Error ('Erro Message')); 
} 

Что в свою очередь вызывает обработчик ошибок промежуточного программного экспресс-в.

app.use(function(err, req, res, next){ 
    if(!err) return next(); 
    console.log('<-------Error Occured ----->'); 
    res.send(500, JSON.stringify(err, ['stack', 'message'])); 
}); 

Но называть вызов следующим (ERR), я вынужден пройти по ссылке для следующего во всех методах обратного вызова через все слои. Я нахожу это беспорядочным aproach. Есть ли лучший способ справиться с исключениями и отправить правильный ответ с помощью событий или доменов.

ответ

0

на страницах ошибок Пример из экспресс showsthe канонический способ обработки ошибок:

https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js

// error-handling middleware, take the same form 
// as regular middleware, however they require an 
// arity of 4, aka the signature (err, req, res, next). 
// when connect has an error, it will invoke ONLY error-handling 
// middleware. 

// If we were to next() here any remaining non-error-handling 
// middleware would then be executed, or if we next(err) to 
// continue passing the error, only error-handling middleware 
// would remain being executed, however here 
// we simply respond with an error page. 
1

Вы всегда должны делегировать ошибку в маршрутах/контроллеров в обработчик ошибок, вызвав следующий (так что вы могут просто иметь дело с ними в одном месте, а не разбросать их по всей вашей заявке).

Вот пример:

app.get('/', function(req, res, next) { 
    db.findUser(req.params.userId, function(err, uid) { 
    if (err) { return next(err); } 

    /* ... */ 
    }); 
}); 

/* Your custom error handler */ 

app.use(function(err, req, res, next) { 
    // always log the error here 

    // send different response based on content type 
    res.format({ 
    'text/plain': function(){ 
     res.status(500).send('500 - Internal Server Error'); 
    }, 

    'text/html': function(){ 
     res.status(500).send('<h1>Internal Server Error</h1>'); 
    }, 

    'application/json': function(){ 
     res.send({ error: 'internal_error' }); 
    } 
    }); 
}); 

Примечание: Вы не должны проверить на err парам в обработчик ошибок, потому что он всегда будет присутствовать.

Также очень важно: всегда делайте return next(err);, потому что вы не хотите, чтобы код успеха выполнялся.

Оба образца кода были ошибочными: в первом случае вы не использовали return next(err), а во втором вы использовали return next(err), поэтому последующий код не должен обрабатывать ошибку (потому что он никогда не попадет туда в случае ошибки), но вместо этого он должен был быть «успешным» кодом.

+0

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

+0

Вам не нужно проходить вокруг 'next' во всех слоях, вы можете использовать обратные вызовы для этого. Например, в обработчике маршрута можно вызвать 'Model.find (userId, cb)', и если вы обнаружите ошибку там, вы вызываете 'next' – alessioalex

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