Обработчик необработанного исключения не вызывается, когда исключение генерируется из маршрутов Express - PullRequest
0 голосов
/ 27 июня 2019

Я написал простой экспресс-маршрут для проверки моего обработчика событий на наличие необработанных исключений, но по какой-то причине при вызове из кода маршрута обработчик события не вызывается:

app.js:

process.on('uncaughtException', err => {
    console.log('Handling exception');
});

app.get('/', (req, res) => {
    console.log('Serving request');
    throw(new Error('Some error'));
    res.send('Hello World!');
});

const port = process.env.PORT || 8888; 
app.listen(port, () => console.log(`Listening on port ${port}...`));

При отправке запроса GET я вижу на экране следующий вывод (стек вызовов сокращен для лучшей читаемости):

Listening on port 8888...
Serving request
Error: error
    at app.get (/Users/omerah/Documents/playground/node/hello-server/app.js:48:11)
    at Layer.handle [as handle_request] (/Users/omerah/Documents/playground/node/hello-server/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/omerah/Documents/playground/node/hello-(/Users/omerah/Documents/playground/node/hello-server/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/omerah/Documents/playground/node/hello-
...

Ниже приведена структура моего кода (упрощенная версия). Исключения вызываются из кода в папке «маршрутов» и должны быть перехвачены обработчиком событий, который определен в app.js:

├── [-rw-r--r--]  app.js
├── [-rw-r--r--]  authenticate.js
├── [drwxr-xr-x]  routes
|   ├── [-rw-r--r--]  login.js
├── [drwxr-xr-x]  modles
├── [drwxr-xr-x]  utils

Почему не вызывается обработчик событий?

1 Ответ

1 голос
/ 29 июня 2019

Не используйте process.on('uncaughtException', () => {}) для отлова ошибок в экспрессе.Вы можете создать пользовательское промежуточное ПО обработчика событий с помощью чего-то вроде:

function myCustomErrorHandler(err, req, res, next) {
  if (<check on error>) {
    console.log('Handling exception');
    // TODO: Optionally, return a response back here using "res"
  }

  next(error);
}

Вы можете использовать этот пользовательский обработчик

app.use(myCustomErrorHandler);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...