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
相关产品推荐
相关产品推荐

