Обработка исключений express.js
Как можно глобально перехватить все ошибки/исключения, которые произошли во внутренних функциях в роуте express.js? В том числе асинхронных функциях.
app.post('/', function(req, res, next) {
const myComponent = require('...');
/*
* Возвращает Promise, внутри этого компонента находится множество
* различных методов с асинхронным (async/await) и параллельным выполнением
* через Promise.all.
* В том числе есть множество вызовов других программ (в отдельных async функциях) через
* https://www.npmjs.com/package/await-spawn и в результате работы могут возникать
* исключения.
*/
myComponent.then(function(data){
res.json(data);
res.end();
});
});
Обернуть снаружи в try/catch естественно никак не поможет.
Если добавить события через process.on, то это перехватит. Но работает слишком глобально и не понятно как тогда вызвать res.end() для того роута, в котором возникла ошибка. А хочется прервать работу конкретного роута в случае возникновения ошибки, а не всего скрипта.
process.on('uncaughtException', function(error) {});
process.on('unhandledRejection', function(reason, p){});
Добавление app.use будет перехватывать исключения, только если их явно бросать вручную внутри каждого асинхронного метода в try/catch через next функцию. А хочется этого избежать и перехватить все, как это делает process.on и завершить с ошибкой конкретный запрос.
app.use(function(err, req, res, next){
res.json({ error: err });
res.end();
});
Понятно, что внутри с каждым исключением нужно разбираться. Но пока пытаюсь добиться такого, чтобы в случае любой ошибки, гарантированно пользователю вернулся 500 код, а не бесконечно повисло соединение (до лимита исполнения по времени).