#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);