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 模式匹配,如链接文档和下面的屏幕截图所示:
我有动态生成的路由器。路由文件位于与路由器路径相对应的文件夹结构中。例如路由 v1/users/getUsers
所以 getUsers.js 在 /api/v1/users/
文件夹中。
我的中间件在 /middlewares/
文件夹中,我正在 /createExpressApp.js
所以目前我在 .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 模式匹配,如链接文档和下面的屏幕截图所示: