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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:45:04