Не нужно указывать промежуточное программное обеспечение для каждого маршрутизатора Express

#node.js #express #middleware #express-router

#node.js #экспресс #промежуточное программное обеспечение #экспресс-маршрутизатор

Вопрос:

В Express я использую разные маршрутизаторы для каждого из своих маршрутов, например:

 const express = require('express');
const postRouter = require('./postRouter');
const userRouter = require('./userRouter');
const app = express();


app.use('/posts', postRouter);
app.use('/users', userRouter);
  

И затем в моих файлах маршрутизатора у меня есть маршруты.

Однако, допустим, что на всех моих страницах я использую сеансы. Если я хочу это сделать, я должен указать router.use(sessionMiddleware); в каждом файле маршрутизатора.

Мой вопрос в том, могу ли я по-прежнему использовать несколько маршрутизаторов без необходимости указывать промежуточное программное обеспечение в каждом файле. Я пробовал app.use(); , но это не работает.

Спасибо

Ответ №1:

Вам нужно сделать то, что, как вы утверждаете, не работает:

 app.use(sessionMiddleware);
  

Однако я могу догадаться, почему ваша попытка не сработала. Вероятно, это происходит из-за вашего непонимания того, как работает Express.

В его основе express является механизмом обработки промежуточного программного обеспечения. Вы настраиваете список промежуточных программ в Express (конечные точки также являются промежуточными программами, просто они выполняются последними), и Express будет обрабатывать их по очереди в порядке.

Последнее предложение наиболее важно для понимания: Express будет обрабатывать промежуточные ПРОГРАММЫ по одному в порядке.

Поэтому, если вы сделаете что-то вроде

 app.use('/posts', postRouter);
app.use('/users', userRouter);
app.use(sessionMiddleware);
  

Что вы делаете, так это сообщаете express для:

  • Сначала посмотрите, соответствует ли запрос ‘/ posts’, если он выполняется postRouter
    • Если postRouter выполняется, посмотрите, вызывает ли маршрут next() функцию без какого-либо аргумента. Если next() вызывается продолжить обработку.
    • Если next() вызывается с любым аргументом, остановите обработку и перейдите к обработчику ошибок (по умолчанию это отправит страницу ошибки обратно в браузер)
    • Если next() это не вызвано, остановите обработку
  • Если обработка продолжается, во-вторых, проверьте, соответствует ли запрос ‘/ users’, если он выполняется userRouter
    • Если userRouter выполняется, посмотрите, вызывает ли маршрут next() функцию без какого-либо аргумента. Если next() вызывается продолжить обработку.
    • Если next() вызывается с любым аргументом, остановите обработку и перейдите к обработчику ошибок
    • Если next() это не вызвано, остановите обработку
  • Если обработка продолжается, выполните sessionMiddleware

Итак, если ваш поток (да, это программный поток, а не просто вызовы API для Express) похож на описанный выше, это означает, что sessionMiddleware не будет выполняться для /posts и /users маршрутов.

Это означает, что вам нужно изменить поток вашей программы следующим образом:

 app.use(sessionMiddleware);
app.use('/posts', postRouter);
app.use('/users', userRouter);
  

Как вы можете видеть, Express очень гибкий. Скажем, например, вы хотите /posts использовать промежуточное программное обеспечение сеанса, но не /users . Вы можете сделать это вместо:

 app.use('/users', userRouter);
app.use(sessionMiddleware);
app.use('/posts', postRouter);