Все операторы app.use()
запускаются при инициализации вашего приложения. Каждый из них настроил обработчик промежуточного программного обеспечения. На данный момент они фактически не запускают обработчики, они просто регистрируют их в стеке промежуточного программного обеспечения Express. Если ни один обработчик перед ними не обрабатывает страницу, эти два последних обработчика промежуточных программ app.use()
получат запрос по заказу по порядку, а второй только увидит запрос, если первый передает запрос на большее количество обработчиков.
Обработчик 404
установит статус на 404
, а затем вызовет обработчик в стек промежуточного программного обеспечения. Это будет вашим последним оператором app.use()
, который будет видеть, был ли статус уже установлен, а если нет, установите его на 500
, но если он был ранее установлен в 404
, он оставит его на этом. Затем он применит рендеринг по умолчанию для отсутствующей страницы, отображающей статус на странице.
Это средство наличия единственного места, где применяется рендеринг по умолчанию, но несколько мест, которые могли бы устанавливать ошибки.
Ничего из этого не имеет никакого отношения к асинхронному поведению. Следующий обработчик запроса в списке запускается только тогда, когда next()
вызывается более ранним обработчиком запросов. Нет «ожидания». Вы можете думать о обработчике запросов 404
, используя последний оператор app.use()
, как вызов синхронной функции, когда он вызывает next()
. Он просто говорит, что выполнить следующий обработчик запроса в цепочке прямо сейчас (который, как он знает, является тем, который обеспечивает рендеринг по умолчанию для кода состояния ошибки).
Это может быть полезно рассмотреть, как app.use()
работает в Express.
Каждый вызов app.use()
добавляет обработчик запроса в список. Когда приходит заданный HTTP-запрос, Express начинает с первого обработчика запроса в списке и проверяет, соответствуют ли параметры этого первого обработчика запроса в текущем запросе (например, соответствует ли путь или какие-либо другие параметры, установленные в списке app.use()
). Если он совпадает, то он вызывает этот обработчик запросов. Если этот обработчик запросов не вызывает next()
, чтобы у следующего обработчика запросов в списке есть шанс на запрос, тогда вся обработка выполняется, и Express предполагает, что первый обработчик запросов полностью обработал запрос. Если этот первый обработчик запросов не полностью обработал запрос (скажем, он просто проверял значение cookie в заголовке и хочет, чтобы обработка продолжалась для других обработчиков), тогда он вызовет next()
. Это говорит экспресс, чтобы посмотреть на следующий обработчик app.use()
в списке и посмотреть, соответствует ли он этому запросу.
Пока обработчик запросов не соответствует текущему запросу или каждому, который продолжает звонить next()
, чтобы сохранить цепочку, Express продолжит движение по списку, ищущему обработчик запроса, чтобы обработать запрос и сгенерировать ответ сервера. В вашем конкретном примере вторым и последним запросом в цепочке является обработчик 404
. Он предполагает, что если Express получил это далеко вниз по цепочке, то никакой обработчик еще не обработал этот запрос, поэтому он должен быть запросом страницы, которую этот сервер не предназначен для обработки. Таким образом, он устанавливает статус в 404. И потому, что рендеринг по умолчанию для страницы с ошибкой находится в самом последнем обработчике запросов, он вызывает next()
, чтобы инициировать отображение последней страницы по умолчанию с ошибкой в нем.
@Jakobud - вы получили достаточное объяснение, чтобы ответить/объяснить свой вопрос или все еще есть вещи вам нужна помощь? – jfriend00