【问题标题】:node.js + express , routers in separated files and middleware only before certain routes?node.js + express ,单独文件和中间件中的路由仅适用于某些路由?
【发布时间】:2020-05-09 01:45:45
【问题描述】:

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

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

所以目前我在.use(auth) 中拥有我的授权中间件,就在.use('/api', router) 之前 这样它工作得很好,在每条路线之前,执行身份验证。但是,我只想保护某些路线。我想我可以在每个文件中导入我想要保护的路由的中间件,但是有些路由在文件夹深处,我的导入会像../../../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 })
    )

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    任何聪明的或基于配置的东西都会让你遇到同样的问题:你需要在某个地方描述哪些路由对其进行身份验证。

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

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

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

    【讨论】:

    • 这看起来正是我所需要的。 router.param 将来也可能会有所帮助。谢谢
    • Np。您可能喜欢路由器文档的最后一个示例/模式,它使用 authRouteropenRouter,请参阅结尾:expressjs.com/en/api.html#router
    • 看起来不错,但由于我的项目结构,我动态加载所有路由并导出它们,然后在快递应用程序中使用。在我定义 express 应用程序之前我很累,但是在我有一个var router = require ('./generateRouter.js') 之后,如果我做了`router.all('*',auth)`,它对路由器没有任何作用。那是正确的地方吗?
    • 我认为您希望通过调用生成动态路由。确保使用中间件时您也记得调用 next()。
    • 我已经添加了我的路由器生成器功能(这不是我的),我以为我了解它是如何工作的,但是现在当我需要将这些附加功能添加到路由器时,我不知道在哪里做。也许我实际上应该创建普通路由器
    猜你喜欢
    • 2020-07-04
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2019-01-05
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多