Node.js & Express - Создавались ли когда-либо объекты Error и передавались в промежуточное ПО без предварительного объявления внутри маршрута? - PullRequest
0 голосов
/ 02 февраля 2020

Среда: Node.js, Express

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

app.get('/', wrapAsync(async function(req, res, next) {

    // synchronous error
    throw new Error('oops');

    // asynchronous error
    //next( new Error('oops I did it again');

    res.send('hello world');
}));

function wrapAsync(fn) {
    return function(req, res, next) {
        fn(req, res, next).catch(next);
    };
}

app.use( function(error, req, res, next) {

    res.send(error);
});

Однако что, если в части моего кода возникает непредвиденная ошибка, когда я не настроил объект Error? Обнаружит ли node.js или Express, что на моем маршруте произошла ошибка, создаст объект Error и перенаправит его в промежуточное ПО через функцию оболочки wrapAsyn c? Мне трудно сосредоточиться на этом, потому что я не уверен, как проверить что-то неожиданное.

Существует ли шаблон, который гарантирует, что все возможные ошибки, возникающие на маршруте, перенаправляются на обработку ошибок промежуточное программное обеспечение без сбоя сервера?

1 Ответ

1 голос
/ 03 февраля 2020

Однако что, если в части моего кода возникнет непредвиденная ошибка, когда я не настроил объект Error?

Если что-то выдает что-то помимо вашего собственного кода (ошибка программирования или непредвиденное исключение), чем любой бросок будет создавать свое собственное исключение. Это условно, но не обязательно, чтобы вы выдавали объекты Error. Пользовательский код может выдать строку или свой собственный объект, если он этого хочет, хотя это не является общим соглашением.

Исключение, сгенерированное интерпретатором (например, TypeError), всегда будет выдавать какой-либо тип объекта Error.

Обнаружит ли node.js или Express, что в моем маршруте произошла ошибка, создаст объект Error и перенаправит его в промежуточное ПО через функцию оболочки wrapAsyn c?

Это не совсем правильный способ думать об этом. Это не Express или node.js это делает. Это какой-то код, вызвавший или выдавший исключение в первую очередь (либо выбрасывавший вручную исключение, либо интерпретатор столкнулся с ошибкой, которая приводит к исключению. Это исключение и откуда оно взято. Потому что вы завернули вещи в async функция, вы, вероятно, увидите это исключение (и связанный с ним объект Error) в вашем обработчике .catch().

Однако существуют ситуации, когда вы все равно не увидите исключение. Если какой-то асинхронный код внутри вашей оболочки использует простые обратные вызовы (не обещания) и выдает исключение внутри этого простого асинхронного обратного вызова, тогда ваша оболочка не будет перехватывать это исключение (ничего не будет), поэтому весь асинхронный код в этой архитектуре должен использовать обещанные асинхронные функции только потому, что он включает automati c распространение ошибок, на которое вы полагаетесь.

Существует ли шаблон, который гарантирует, что все возможные ошибки, возникающие на маршруте, передаются в промежуточное ПО для обработки ошибок без вас t сбой сервера?

Нет. Нет, если функция использует простые, не обещанные асинхронные обратные вызовы. Как описано выше, в этом случае ошибки не будут распространяться вплоть до вашей оболочки.


FYI, см. Express промежуточное ПО не может перехватывать ошибки, выдаваемые асинхронным / ожидающим, но почему? для схемы встраивания обнаружения отклоненных обещаний в Express. Также есть кузен Express, 1028 * коа , который делает это более автоматически в рамках своей архитектуры.

...