У меня роутер динамически генерируется. Файлы маршрутов находятся в структуре папок, соответствующей пути маршрутизатора. например, route v1/users/getUsers
, поэтому getUsers. js находится в папке /api/v1/users/
.
Мои промежуточные продукты находятся в папке /middlewares/
, и я создаю приложение express в /createExpressApp.js
так что в настоящее время у меня есть мое промежуточное программное обеспечение авторизации в .use(auth)
как раз перед .use('/api', router)
Таким образом, он работает просто отлично, перед каждым маршрутом выполняется auth. Однако я хочу защитить только определенные маршруты. Я думаю, что я мог бы просто импортировать свое промежуточное ПО в каждый файл с маршрутом, который я хочу защитить, но некоторые из маршрутов глубоко в папках, и мой импорт был бы чем-то уродливым, как ../../../middlware/auth.js
Есть какой-нибудь умный способ чтобы избежать такого импорта?
Вот мое создание маршрутизатора Dynami c, я признаю, что нашел это решение где-то в inte rnet, и я понимаю идею, но не знаю, куда поместить некоторые дополнительные функции для router, такие как router.all или router.use
import { sync } from 'glob'
import { Router } from 'express'
const auth = require('../middlewares/auth.js').isAuthenticated
export default () => sync('**/*.js', { cwd: `${__dirname}/` })
.map(filename => require(`./${filename}`).default)
.filter(router => Object.getPrototypeOf(router) == Router)
.reduce(
(rootRouter, router) =>rootRouter.use(router),
Router({ mergeParams: true })
)
, поэтому отвечаю на мою собственную проблему + ответ снизу с помощью router.all (или другие из документации). Я бы поставил это здесь:
export default () => sync('**/*.js', { cwd: `${__dirname}/` })
.map(filename => require(`./${filename}`).default)
.filter(router => Object.getPrototypeOf(router) == Router)
.reduce(
(rootRouter, router) =>rootRouter
.all('*getUsers',auth)
.use(router)
,
Router({ mergeParams: true })
)