node.js + express, маршрутизаторы в отдельных файлах и промежуточном программном обеспечении только до определенных маршрутов? - PullRequest
2 голосов
/ 22 января 2020

У меня роутер динамически генерируется. Файлы маршрутов находятся в структуре папок, соответствующей пути маршрутизатора. например, 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 })
    )

1 Ответ

2 голосов
/ 22 января 2020

Что-нибудь умное или основанное на конфигурации оставит вас с той же проблемой: где-то вам нужно описать, какие маршруты имеют над ними аутентификацию.

Кажется, что самый простой способ сделать это - потребовать авторизацию на необходимые маршруты.

Вам следует ознакомиться с документацией express промежуточного программного обеспечения , так как вы можете разбить приложение на разные маршрутизаторы и router.use.

Типичным шаблоном будет использовать router.all для определения конечных точек, которым требуется авторизация. Вы можете использовать регулярное выражение / сопоставление с шаблоном маршрута, как показано в связанной документации и на снимке экрана ниже:

on router

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...