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

时间:2020-01-22 20:09:02

标签: node.js express middleware

我动态生成了路由器。路由文件采用与路由器路径相对应的文件夹结构。例如路由v1/users/getUsers,因此getUsers.js位于/api/v1/users/文件夹中。

我的中间件位于/middlewares/文件夹中,而我正在/createExpressApp.js中生成快递应用程序

所以目前我在.use(auth)之前的.use('/api', router)中拥有我的授权中间件 这样,在执行每个路由auth之前,它就可以正常工作。但是,我只想保护某些路线。我想我可以使用要保护的路由将中间件导入每个文件中,但是其中一些路由位于文件夹深处,并且导入的过程很像../../../middlware/auth.js

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

这是我的路由器动态创建,我承认我在Internet上的某个地方找到了该解决方案,并且我理解了想法,但是不知道在哪里放置一些额外的路由器,例如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 个答案:

答案 0 :(得分:2)

任何聪明或基于配置的问题都会使您面临相同的问题:您需要在某个地方描述哪些路由对其进行了身份验证。

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

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

典型的模式是使用router.all来定义需要认证的端点。您可以使用正则表达式/路由模式匹配,如链接文档和以下屏幕截图所示:

on router