node.js + express ,仅在某些路由之前在分隔文件和中间件中的路由器?

node.js + express , routers in separated files and middleware only before certain routes?

我有动态生成的路由器。路由文件位于与路由器路径相对应的文件夹结构中。例如路由 v1/users/getUsers 所以 getUsers.js 在 /api/v1/users/ 文件夹中。

我的中间件在 /middlewares/ 文件夹中,我正在 /createExpressApp.js

中生成我的 express 应用程序

所以目前我在 .use(auth) 中有我的授权中间件,就在 .use('/api', router) 之前 这样它工作得很好,在每个 route 之前, auth 被执行。但是,我只想保护某些路线。我想我可以在每个文件中导入我的中间件,其中包含我想要保护的路由,但有些路由在文件夹深处,我的导入会像 ../../../middlware/auth.js

这样难看

有什么聪明的方法可以避免这种导入吗?

这是我的路由器动态创建,我承认我在互联网上的某个地方找到了解决方案,我确实理解这个想法,但不知道在哪里为路由器放置一些额外的东西,例如 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 })
    )

任何聪明的或基于配置的东西都会让你陷入同样的​​问题:你需要在某个地方描述哪些路由对其进行了授权。

似乎最简单的方法是要求对所需路由进行身份验证。

您应该查看 express middleware documentation,因为您可以将应用分解为不同的路由器和 router.use

一个典型的模式是使用 router.all 来定义需要授权的端点。您可以使用 regex/route 模式匹配,如链接文档和下面的屏幕截图所示: