2015-04-18 5 views
1

Я хочу разработать обработку ошибок в одной точке приложения expressJS.
Я добавил следующий код в конфигурации expressJS:Обработка ошибок в ExpressJS

app.use(app.router); 
app.use(function (err, req, res, next) { 
    console.error('ExpressJS : error!!!'); 
}); 


Таким образом, любая ошибка в приложении, то данная функция должна получить выполнить так, что я могу справиться ошибка в пользовательском пути.
Но выше функция не получает выполнения на Java-ошибка или следующий код:

throw new Error('something broke!'); 

Я прочитал:
http://expressjs.com/guide/error-handling.html и
http://derickbailey.com/2014/09/06/proper-error-handling-in-expressjs-route-handlers/
Но, до сих пор я не в состоянии сделать общие обработки ошибок в моем приложении expressJS.
Может ли кто-нибудь объяснить, как я буду обрабатывать любую ошибку приложения в одной точке?

+1

Если бы это было так просто. Ошибка может произойти почти в любом месте, вам придется поймать ее там, где это происходит. Конечно, вы можете использовать один маршрут для ответа на ошибки сервера, но вы не можете поймать все и любые ошибки в этом маршруте. – adeneo

ответ

5

Не курьерский, но nodejs, вы можете попробовать

process.on('uncaughtException', function(err) { 
    console.log(err); 
}); 

Поскольку "бросок" является JavaScript, не под expressjs контроля.

Для этих ошибок, как маршрутизация в экспресс, вы должны иметь возможность поймать с app.error или app.use (функция (эээ .. как и другие советовали, которые будут доступны REQ, Рез объект тоже.

app.error(function(err, req, res, next){ 
    //check error information and respond accordingly 
}); 

//newer versions 
app.use(function(err, req, res, next) { 

}); 
+0

Возможно ли получить объект запроса и ответа в приведенном выше коде? –

+0

насколько я знаю. nope, throw - это код javacript, и это код javascript. оба выполняются в nodejs, а не по выражению. или попробуйте app.error – YOU

+0

Есть ли способ обхода для объекта запроса и ответа в приведенном выше случае? –

0

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

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

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

app.use(bodyParser()); 
app.use(methodOverride()); 
app.use(logErrors);   // log the error 
app.use(clientErrorHandler); // catch the client error , maybe part of the router 
app.use(errorHandler);   // catch the error occured in the whole router 

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

+0

Я использовал выше код, но все же он не работает. –

+0

это какая-то ошибка произошла в вашем экспрессе? – qianjiahao

+0

Бросьте новую ошибку («что-то сломалось!«); –

0

В экспрессе, вы вызываете ошибку маршрута обработки путем вызова next() с параметром, следующим образом:.

app.get('/api/resource',function(req, res, next) { 
    //some code, then err occurs 
    next(err); 
}) 

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

Насколько я знаю, если вы просто throw ошибки, это не будет поймана курьерским, и вы можете сломать экземпляр вашего узла.

Помните, что вы можете иметь столько обработчиков ошибок, как вам нужно:

app.use(function (err, req, res, next) { 
    //do some processing... 
    //let's say you want more error middleware to trigger, then keep on calling next with a parameter 
    next(err); 
}); 
Смежные вопросы