NestJS中如何将JSON参数category映射为DTO的type字段?
在NestJS中实现DTO属性与JSON参数的映射(类似Swift的CodingKeys)
NestJS默认集成了class-transformer库,用它就能实现类似Swift CodingKeys的属性映射,新项目一般无需额外安装,旧项目可以执行npm install class-transformer class-validator确保依赖齐全。下面提供两种实现方案:
方案一:使用@Expose装饰器指定别名
直接通过装饰器配置JSON参数与DTO属性的对应关系,代码简洁直观:
// create-class.dto.ts import { IsNumber } from 'class-validator'; import { Expose } from 'class-transformer'; // 假设你定义的CustomType类型 export enum CustomType { TYPE_1 = 1, // 其他类型定义... } export class CreateClassDto { @IsNumber() // 明确指定JSON中的"category"对应DTO的"type"属性 @Expose({ name: 'category' }) type: CustomType; }
关键配置:启用自动转换
需要在项目入口文件main.ts中开启ValidationPipe的自动转换功能,确保NestJS能自动处理属性映射:
// main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 全局启用验证管道,开启DTO自动转换 app.useGlobalPipes(new ValidationPipe({ transform: true, transformOptions: { enableImplicitConversion: true, // 可选,自动转换基本数据类型 }, })); await app.listen(3000); } bootstrap();
方案二:使用@Transform装饰器手动映射(更灵活)
如果需要对参数做额外处理(比如类型转换、设置默认值等),可以用@Transform手动获取JSON参数值:
// create-class.dto.ts import { IsNumber } from 'class-validator'; import { Transform } from 'class-transformer'; export enum CustomType { TYPE_1 = 1, } export class CreateClassDto { @IsNumber() // 从传入的请求对象中直接提取"category"的值赋值给"type" @Transform(({ obj }) => obj.category) type: CustomType; }
效果说明
当客户端传入{"category":1}时,NestJS会自动将其转换为DTO的type: 1,后续服务层可以直接使用DTO的type属性与实体、数据库交互,完全不需要修改实体的字段名,避免服务崩溃或数据库保存失败的问题。
内容的提问来源于stack exchange,提问作者sidneivl
相关产品推荐
相关产品推荐

