You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js重构Express路由:避免重复应用权限验证中间件

如何避免在Express路由端点重复添加中间件?

如何避免在每个路由端点重复使用中间件?是否可以仅配置一次isUserAuth和isAdminAuth中间件,使其自动应用到所有相关路由/端点,无需在每个路由上重复添加?

当前代码示例:

const { createBranch, getAllBranch, getBranch } = require('../controllers/user')
const { isUserAuth, isAdminAuth } = require('../middlewares/auth')

const router = require('express').Router()

// branch
router.post('/', isUserAuth, isAdminAuth, createBranch)
router.get('/', isUserAuth, isAdminAuth, getAllBranch)
router.get('/:id', isUserAuth, isAdminAuth, getBranch)
router.put('/:id', isUserAuth, isAdminAuth, getBranch)

module.exports = router

解决方案:利用router.use()批量应用中间件

Express提供的router.use()方法可以一次性给当前路由实例下的所有后续路由挂载中间件,彻底避免重复编写。

方法1:给整个路由组统一添加中间件

如果所有分支路由都需要isUserAuth和isAdminAuth验证,直接在路由定义前调用router.use():

const { createBranch, getAllBranch, getBranch } = require('../controllers/user')
const { isUserAuth, isAdminAuth } = require('../middlewares/auth')

const router = require('express').Router()

// 一次性挂载中间件,后续所有路由都会自动应用这两个验证逻辑
router.use(isUserAuth, isAdminAuth)

// 分支路由无需再重复声明中间件
router.post('/', createBranch)
router.get('/', getAllBranch)
router.get('/:id', getBranch)
router.put('/:id', getBranch)

module.exports = router

方法2:拆分路由组区分验证逻辑

如果存在部分路由不需要验证的情况,可以创建子路由组,仅给需要验证的路由挂载中间件:

const { createBranch, getAllBranch, getBranch, getPublicBranch } = require('../controllers/user')
const { isUserAuth, isAdminAuth } = require('../middlewares/auth')

const router = require('express').Router()

// 创建受保护的子路由组,只给这个组挂载验证中间件
const protectedBranchRouter = require('express').Router()
protectedBranchRouter.use(isUserAuth, isAdminAuth)

// 受保护的路由挂载到子路由组
protectedBranchRouter.post('/', createBranch)
protectedBranchRouter.get('/', getAllBranch)
protectedBranchRouter.get('/:id', getBranch)
protectedBranchRouter.put('/:id', getBranch)

// 无需验证的路由直接挂载到主路由
router.get('/public', getPublicBranch)

// 把子路由组挂载到主路由(前缀可根据需求设置,这里设为空)
router.use('/', protectedBranchRouter)

module.exports = router

注意事项

  • router.use()的中间件会按顺序应用到后续所有路由,必须写在路由定义之前才会生效。
  • 如果主应用给该路由设置了前缀(比如app.use('/branches', branchRouter)),中间件依然会作用于所有/branches开头的路径。

内容的提问来源于stack exchange,提问作者Akachukwu Udechukwu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:10:23