Обработка исключений 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 код, а не бесконечно повисло соединение (до лимита исполнения по времени).


Ответы (0 шт):