为何NestJS在实体和DTO要求关联时仍保存null关联模型?
问题原因及解决方案
出现这个问题的核心原因是Unit实体的company关联未正确设置非空约束,或DTO未对company字段做必填验证,导致请求未传company时,字段被默认设为null且通过了保存校验。
排查步骤与解决方法
1. 检查TypeORM实体的非空配置
确保Unit实体中@ManyToOne装饰器明确设置nullable: false,这样TypeORM会在数据库生成非空约束,且保存时自动校验:
// unit.entity.ts import { Entity, ManyToOne, Column } from 'typeorm'; import { Company } from './company.entity'; @Entity() export class Unit { // 其他字段... @Column() name: string; @Column() address: string; @ManyToOne(() => Company, company => company.units, { nullable: false, // 关键:禁止关联为null onDelete: 'CASCADE' // 根据业务需求可选 }) company: Company; }
如果之前没加nullable: false,数据库表的company_id字段可能允许null,所以保存null不会触发错误。
2. 给UnitCreateDto添加必填验证
使用class-validator给company相关字段加必填校验,确保请求未传该字段时直接拦截:
// unit-create.dto.ts import { IsNotEmpty, IsNumber } from 'class-validator'; export class UnitCreateDto { @IsNotEmpty({ message: '名称不能为空' }) name: string; @IsNotEmpty({ message: '地址不能为空' }) address: string; // 如果传的是公司ID,用以下验证 @IsNotEmpty({ message: '所属公司不能为空' }) @IsNumber({}, { message: '公司ID必须为数字' }) companyId: number; }
同时要确保项目启用了验证管道(比如NestJS中在main.ts配置):
// main.ts import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ whitelist: true, // 自动移除DTO未定义的字段 transform: true, // 自动转换字段类型 forbidNonWhitelisted: true // 禁止传入DTO未定义的字段 })); await app.listen(3000); } bootstrap();
3. 检查服务层的关联赋值逻辑
确保创建Unit时,正确将传入的companyId转换为Company实体,避免直接赋值null:
// unit.service.ts async createUnit(unitCreateDto: UnitCreateDto) { // 先校验公司是否存在 const company = await this.companyRepository.findOneBy({ id: unitCreateDto.companyId }); if (!company) { throw new Error('指定的公司不存在'); } // 创建Unit实体并关联公司 const unit = this.unitRepository.create({ name: unitCreateDto.name, address: unitCreateDto.address, company: company // 直接关联查询到的Company实体 }); return this.unitRepository.save(unit); }
如果服务层直接展开unitCreateDto赋值,而DTO中company字段未传时为undefined,TypeORM会将undefined转为null,若实体允许nullable则会成功保存。
内容的提问来源于stack exchange,提问作者Rustam Apay
相关产品推荐
相关产品推荐

