Однако что, если в части моего кода возникнет непредвиденная ошибка, когда я не настроил объект Error?
Если что-то выдает что-то помимо вашего собственного кода (ошибка программирования или непредвиденное исключение), чем любой бросок будет создавать свое собственное исключение. Это условно, но не обязательно, чтобы вы выдавали объекты Error. Пользовательский код может выдать строку или свой собственный объект, если он этого хочет, хотя это не является общим соглашением.
Исключение, сгенерированное интерпретатором (например, TypeError), всегда будет выдавать какой-либо тип объекта Error.
Обнаружит ли node.js или Express, что в моем маршруте произошла ошибка, создаст объект Error и перенаправит его в промежуточное ПО через функцию оболочки wrapAsyn c?
Это не совсем правильный способ думать об этом. Это не Express или node.js это делает. Это какой-то код, вызвавший или выдавший исключение в первую очередь (либо выбрасывавший вручную исключение, либо интерпретатор столкнулся с ошибкой, которая приводит к исключению. Это исключение и откуда оно взято. Потому что вы завернули вещи в async
функция, вы, вероятно, увидите это исключение (и связанный с ним объект Error) в вашем обработчике .catch()
.
Однако существуют ситуации, когда вы все равно не увидите исключение. Если какой-то асинхронный код внутри вашей оболочки использует простые обратные вызовы (не обещания) и выдает исключение внутри этого простого асинхронного обратного вызова, тогда ваша оболочка не будет перехватывать это исключение (ничего не будет), поэтому весь асинхронный код в этой архитектуре должен использовать обещанные асинхронные функции только потому, что он включает automati c распространение ошибок, на которое вы полагаетесь.
Существует ли шаблон, который гарантирует, что все возможные ошибки, возникающие на маршруте, передаются в промежуточное ПО для обработки ошибок без вас t сбой сервера?
Нет. Нет, если функция использует простые, не обещанные асинхронные обратные вызовы. Как описано выше, в этом случае ошибки не будут распространяться вплоть до вашей оболочки.
FYI, см. Express промежуточное ПО не может перехватывать ошибки, выдаваемые асинхронным / ожидающим, но почему? для схемы встраивания обнаружения отклоненных обещаний в Express. Также есть кузен Express, 1028 * коа , который делает это более автоматически в рамках своей архитектуры.