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

Node.js routing-controllers如何在@UseBefore/@UseAfter中间件调用时传动态参数

带参数的routing-controllers中间件实现方案

基础实现(Express风格)

你需要将中间件封装为高阶函数:外层接收自定义入参(比如权限列表),执行后返回标准的Express中间件函数。返回的中间件函数可以同时访问外层传入的参数,以及Express原生的req、res、next对象。
示例实现如下:

// 权限校验中间件:外层接收权限列表参数
function checkPermission(requiredPermissions: string[]) {
  // 返回符合Express规范的中间件函数
  return (request: any, response: any, next: (err?: any) => void) => {
    // 示例逻辑:从请求上下文中获取当前用户已有的权限
    const userPermissions = request.user?.permissions || []
    // 校验用户是否拥有所有需要的权限
    const hasAccess = requiredPermissions.every(perm => userPermissions.includes(perm))

    if (!hasAccess) {
      // 权限不足直接返回403
      return response.status(403).json({ msg: "权限不足,无法访问当前接口" })
    }

    // 校验通过,继续执行后续逻辑
    next()
  }
}

使用方式和你期望的完全一致:

@Get("/something/:id")
@UseBefore(checkPermission(['canReadThis','canWriteThis']))
getOne(@Param("id") id: number) {
    // 接口业务逻辑
}

进阶:获取控制器/路由元信息

如果你需要获取当前路由所属的控制器类、路由方法名等额外上下文,可以使用routing-controllers内置的createMiddlewareDecorator方法创建自定义装饰器,能拿到更完整的路由上下文:

import { createMiddlewareDecorator } from 'routing-controllers';

// 创建自定义权限校验装饰器
const CheckPermission = createMiddlewareDecorator((requiredPermissions: string[]) => {
  return async (action: any, next: () => Promise<any>) => {
    // action对象包含完整的路由上下文
    const req = action.request; // Express原生request对象
    const res = action.response; // Express原生response对象
    const controllerClass = action.target; // 当前路由所属的控制器类
    const controllerInstance = action.object; // 控制器实例
    const routeMethodName = action.method; // 路由对应的类方法名,比如当前示例的getOne

    // 权限校验逻辑和上面一致
    const userPermissions = req.user?.permissions || []
    const hasAccess = requiredPermissions.every(perm => userPermissions.includes(perm))
    if (!hasAccess) {
      throw new Error("权限不足")
    }

    await next()
  }
})

使用时直接调用自定义装饰器即可:

@Get("/something/:id")
@CheckPermission(['canReadThis','canWriteThis'])
getOne(@Param("id") id: number) {
    // 接口业务逻辑
}

注意事项

  • 如果使用Koa框架,仅需要将req/res替换为Koa上下文对应的属性即可,核心逻辑完全一致
  • 中间件中抛出的错误可以配合routing-controllers的全局错误拦截器统一格式化返回内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:09:00