2016-11-13 1 views
2

Допустим, я определил следующие промежуточные и маршрутные обработчика:Express.js: вызывает ли вызов (ошибка) от обработчика маршрута глобальное связывание с ошибками?

app.use(function(err,req,res,next) { 
    res.status(500).send('Something broke!'); 
}); 

app.get('/test',function(req,res) { 
    //some error happens here, and ther "error" object is defined 
    next(error); 
}); 

Doe обработка ошибки промежуточной дозвонилась?

Если нет, то обработка промежуточного слоя ошибки можно назвать, если

  • обработка ошибок промежуточного слоя была определена НИЖЕ обработчика маршрута?
  • Я использую throw error; вместо next(error);?
  • оба эти слова верны?

Или я должен делать что-то вроде этого:

//route.js 
module.exports=function(req,res,next) { 
    //error happens here 
    next(error); 
} 

//errorHandler.js 
module.exports=function(err,req,res,next) { 
    res.status(500).send('Something broke!'); 
} 

//app.js 
var route=require('route'); 
var errorHandler=require('erorHandler'); 
app.get('/test',[route,errorHandler]); 

Я немного смущен прямо сейчас ...

ответ

2

Порядка промежуточных программных, app.get, app.post и т.д. вопросов, они обрабатываются в том порядке, в котором они добавлены в ваш код.

Так что, когда вы определяете его, как вы делали

app.use(function(err,req,res,next) { 
    res.status(500).send('Something broke!'); 
}); 

app.get('/test',function(req,res) { 
    //some error happens here, and ther "error" object is defined 
    next(error); 
}); 

первый промежуточного слоя будет ловить все запросы и возвращает статус 500, так что никогда не достигнет app.get('test'...

обработчик ошибок всегда должен быть на дне вашего кода, поэтому, если в каком-то маршрутном обработчике есть ошибка, вы вызываете next(error), и обработчик ошибок ответит на сообщение с вашим сообщением res.status(500).send('Something broke!');

И это

app.get('/test',[route,errorHandler]); 

является actualy плохо, так как вам нужно будет использовать его в каждом маршруте

Хорошо:

app.get('/test',function(req,res,next) { 
    //some error happens here, and ther "error" object is defined 
    next(error); 
}); 

app.use(function(err,req,res,next) { 
    res.status(500).send('Something broke!'); 
}); 

app.listen(8000); 
+0

Ах, так что в следующем (ошибка) будет идти в ошибку обработки промежуточного уровня, даже если он не определено в маршруте, что такое «следующий»? – Alex

+0

О, извините, это опечатка, 'next' должна быть в функции обратного вызова' app.get ('/ test', function (req, res, next) 'иначе вы получите ошибку' 'next" не является функцией ' – Molda

+0

Будет ли 'next (error)' игнорировать промежуточное программное обеспечение с символом '' req, res, next '' и перейти прямо к следующему промежуточному программному обеспечению с '' ошибкой, req, res, next ''? – Alex

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

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