NestJS自定义邮箱校验报错Cannot read properties of undefined
问题原因
你已经完成了给约束类加@Injectable()装饰器、在模块providers数组注册提供者这两个正确步骤,但核心遗漏了将class-validator的实例化逻辑交给NestJS依赖注入容器接管。默认情况下class-validator会自行实例化校验约束类,不会走Nest的DI注入流程,所以类里的usersService没有被注入、值为undefined,调用findOneByEmail方法时自然会抛出属性读取错误。
修复步骤
1. 在项目入口main.ts中配置DI容器接管
打开项目入口文件main.ts,添加如下核心配置:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; // 新增以下两行导入 import { useContainer } from 'class-validator'; import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 全局校验管道(未开启可补充配置) app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, })); // 核心配置:让class-validator优先使用Nest DI容器实例化校验类 useContainer(app.select(AppModule), { fallbackOnErrors: true }); await app.listen(3000); } bootstrap();
配置项fallbackOnErrors: true必须添加,作用是当class-validator在Nest容器中找不到对应提供者时,会退回默认实例化逻辑,不会影响框架内置校验规则的正常运行。
2. 核对现有配置
确认你当前的代码符合以下要求,无需额外修改业务逻辑:
EmailAlreadyExistConstraint类同时标注了@ValidatorConstraint()和@Injectable()装饰器- 约束类已经注册在所属业务模块(当前为UsersModule)的
providers数组中 - 约束类依赖的
UsersService已在同模块注册,同模块调用无需额外配置exports,跨模块复用才需要导出
3. 重启服务
修改完入口文件配置后,必须完全重启Nest开发服务,新配置才会生效。
额外场景说明
如果后续需要把自定义校验规则抽到公共模块给全项目复用,只需要把约束类加到公共模块的providers和exports数组中,再在需要用到校验规则的业务模块里导入该公共模块即可。
内容的提问来源于stack exchange,提问作者yourname
相关产品推荐
相关产品推荐

