Nestjs使用applyDecorators组合装饰器提示Roles不是函数如何解决
NestJS 自定义组合装饰器
Roles is not a function 报错排查方案 常见原因及对应解决方法
1. 装饰器导入方式错误
这是最高发的原因,你定义的Roles是具名导出,如果导入时误用了默认导入语法,就会拿到undefined,调用时直接报不是函数的错误。
正确导入示例:
// 控制器文件头部,使用具名导入,路径和文件名大小写要完全匹配 import { Roles } from './auth'; // 替换为你实际的装饰器定义文件路径
错误导入示例:
// 错误:使用默认导入语法 import Roles from './auth';
2. 装饰器定义文件依赖缺失
定义Roles装饰器的文件需要正确导入所有依赖,缺失任意依赖都会导致装饰器初始化失败,核对你的装饰器定义文件是否包含以下导入:
import { applyDecorators, SetMetadata, UseGuards } from '@nestjs/common'; import { RolesGuard } from './roles.guard'; // 替换为你实际的RolesGuard文件路径
3. 循环依赖问题
如果RolesGuard内部导入了Roles装饰器,就会形成循环依赖,模块加载时Roles变量会被初始化为undefined,不是可调用的函数。
解决方法:用forwardRef包裹RolesGuard引用:
import { applyDecorators, SetMetadata, UseGuards, forwardRef } from '@nestjs/common'; export const ROLES_KEY = 'roles'; export const Roles = (...roles: string[]) => applyDecorators( SetMetadata(ROLES_KEY, roles), UseGuards(forwardRef(() => RolesGuard)) )
4. 编译缓存问题
旧的编译产物残留可能导致运行的不是最新代码,按顺序执行以下操作即可:
- 删除项目根目录下的
dist文件夹 - 停止当前运行的开发服务
- 重新执行
npm run start:dev启动服务
内容的提问来源于stack exchange,提问作者rudolf
相关产品推荐
相关产品推荐

