NestJS中class-transformer的DTO返回多余键问题求助
解决NestJS序列化后返回带多余
televisions键的数组问题 问题出在你的UserTvDto结构定义错误,导致序列化时每个电视对象被包裹在了televisions键下。以下是具体的修复步骤:
1. 修正DTO的结构
你的UserTvDto不应该将电视字段嵌套在televisions属性下,而是直接定义单个电视对象的字段。比如:
// src/dtos/television.dto.ts import { Expose } from 'class-transformer'; export class TelevisionDto { @Expose() id: string; @Expose() name: string; @Expose() brand: string; // 其他你需要返回的电视字段 }
如果坚持要用UserTvDto作为文件名,直接把上面的字段定义放到UserTvDto里即可,核心是不要嵌套televisions顶层属性。
2. 调整拦截器与控制器的配合
在控制器中,确保使用的拦截器指向修正后的DTO,并且直接返回user.televisions数组:
// src/users/users.controller.ts import { UseInterceptors, Get, Param } from '@nestjs/common'; import { SerializeInterceptor } from '../interceptors/serialize.interceptor'; import { TelevisionDto } from '../dtos/television.dto'; import { UsersService } from './users.service'; @Controller('users') export class UsersController { constructor(private usersService: UsersService) {} @UseInterceptors(new SerializeInterceptor(TelevisionDto)) @Get(':id/televisions') async getUserTelevisions(@Param('id') id: string) { const user = await this.usersService.findOne(id, { populate: ['televisions'] }); return user.televisions; } }
为什么之前会出现多余的televisions键?
之前的UserTvDto大概率是类似这样的错误结构:
// 错误示例 export class UserTvDto { @Expose() televisions: { id: string; name: string; }; }
当你返回user.televisions数组时,class-transformer会遍历数组中的每个元素,将其映射到UserTvDto的结构上——也就是把每个电视对象放到televisions键下,最终就得到了[{televisions: {...}}, {televisions: {...}}]的结果。修正DTO结构后,每个数组元素会直接映射为DTO定义的字段,自然就去掉了多余的键。
内容的提问来源于stack exchange,提问作者Dora
相关产品推荐
相关产品推荐

