NestJS自定义验证管道报错:无法读取undefined属性
自定义验证管道报错:无法读取undefined属性
你遇到的报错本质是exerciceRepository依赖注入失败——也就是this.exerciceRepository为undefined,调用findOne时触发了“读取undefined属性”的错误。虽然路由里findOne能正常执行,但自定义验证器的DI逻辑和路由控制器的DI逻辑不一样,需要额外配置。
修复步骤
1. 把验证器注册到对应模块
在你存放ExerciceRepository的模块(或使用该验证器的业务模块)中,将ExerciceExistRule加入providers数组,确保Nest的DI容器能管理它:
// 示例:exercice.module.ts import { Module } from '@nestjs/common'; import { ExerciceRepository } from './Infrastructure/repository/exercice.repository'; import { ExerciceExistRule } from './path/to/your-validation-rule'; @Module({ providers: [ExerciceRepository, ExerciceExistRule], // 如果其他模块要用到这个验证器,记得导出 exports: [ExerciceExistRule] }) export class ExerciceModule {}
2. 检查DTO的验证器使用方式
在需要验证的DTO类里,确保用@Validate()装饰器正确引入规则:
import { Validate } from 'class-validator'; import { ExerciceExistRule } from './path/to/your-validation-rule'; export class TargetDto { @Validate(ExerciceExistRule) exerciceId: string; }
3. 确认Repository的注入合法性
检查ExerciceRepository本身是否已经正确注册到模块的providers中:
- 如果是自定义Repository,要确保它被标记为
@Injectable() - 如果是TypeORM的Repository,要确保用
@InjectRepository(ExerciceEntity)完成注入
额外注意
如果这个验证器需要全局使用,要在AppModule里通过@Global()装饰器或者ValidationPipe的全局配置来注册,避免每个模块重复导入。
内容的提问来源于stack exchange,提问作者lcsaloon
相关产品推荐
相关产品推荐

