使用class-transformer暴露嵌套对象数组时返回空对象如何解决
NestJS class-transformer 嵌套数组序列化空对象解决方案
问题根因
TypeScript的类型注解仅在编译期生效,运行时class-transformer无法识别Array<mock>中声明的元素类型,处理数组元素时不会按照mock类的规则做序列化。你开启了excludeExtraneousValues: true配置,该配置会过滤所有未在当前序列化类上标记@Expose的字段,数组元素的字段不属于外层UserDto的暴露字段,因此被全部过滤,最终返回空对象。
解决步骤
- 从
class-transformer中导入@Type装饰器,为嵌套数组字段指定运行时转换的类,让class-transformer识别数组元素的序列化规则 - (可选)将已废弃的
plainToClass方法替换为新版plainToInstance,兼容后续class-transformer版本迭代
修正后代码
Dto定义
import { Expose, Type } from 'class-transformer'; // 类名首字母大写符合TypeScript命名规范 class Mock { @Expose() id : string; @Expose() createdAt : Date; @Expose() updatedAt : Date; } export class UserDto { @Expose() id : string; @Expose() userName : string; @Expose() email : string; @Expose() bio : string; @Expose() avatar : string; @Expose() followerCount : number; @Expose() followeeCount : number; @Expose() verified : boolean; @Expose() @Type(() => Mock) followers : Array<Mock>; @Expose() @Type(() => Mock) followees : Array<Mock>; }
序列化拦截器(可选优化)
import { plainToInstance } from 'class-transformer'; export function Serialize(dto: ClassConstructor) { return UseInterceptors(new Serializeinterceptor(dto)); } export class Serializeinterceptor implements NestInterceptor { constructor(private dto: any) {} intercept(context: ExecutionContext, handler: CallHandler) { return handler.handle().pipe( map((data: any) => { return plainToInstance(this.dto, data, { excludeExtraneousValues: true, }); }), ); } }
内容的提问来源于stack exchange,提问作者rickster
相关产品推荐
相关产品推荐

