Если выброс выполняется синхронно, вы можете изобрести свой собственный обработчик запросов, который будет перехватывать любые исключения и превращать их в вызов next()
:
app.get2 = function(path, fn) {
app.get(path, function(req, res, next) {
try {
fn(req, res, next);
} catch(err) {
next(err);
}
});
};
И пример использования:
app.get2("/test", function(req, res, next) {
throw new Error("testing..."); // will end up in next()
});
Тогда, если ваша fn
функция генерирует синхронно, она будет перехвачена вашей get2()
оболочкой и автоматически вызовет next(err)
для вас.
Если вы выполняете асинхронный бросокэто не сработает. Не существует универсальной оболочки для асинхронных бросков, потому что броски в асинхронный обратный вызов не бросают в ваш код - они отбрасывают обратно в асинхронную инфраструктуру для любой асинхронной операции, которую вы использовали, и только они могут ее перехватить. Если вы используете обещания исключительно для асинхронных операций, то инфраструктура обещаний автоматически поймает ваши броски и превратит их в отклоненные обещания, и вы могли бы сделать что-то подобное выше для возвращенного и отклоненного обещания. Платформа Koa (производная от Express) уже делает нечто подобное, и я думаю, что Express 5 будет иметь некоторые функции, подобные этим.