NestJS:无法在 console.log 中获取嵌套对象。错误:类型 Dto 上不存在属性 x

Posted

技术标签:

【中文标题】NestJS:无法在 console.log 中获取嵌套对象。错误:类型 Dto 上不存在属性 x【英文标题】:NestJS: Cannot get nested object in console.log. Error: Property x does not exist on type Dto 【发布时间】:2022-01-13 21:51:16 【问题描述】:

由于某种原因,我无法在控制台日志中显示嵌套对象。大约一天以来一直在寻找解决方案。

这是我的 JSON:


   "data": 
      "assets": [
              
                 "asset_name": "Image1.jpg",
                 "asset_type": "photo",
                 "is_featured": true,
                 "asset_id": "alksjd78987120-kjahsdkjahsd61238-kjahsdkjahsjkdh",
                 "action": "delete"
              ,
              
                  "asset_name": "Image2.jpg",
                  "asset_type": "photo",
                  "action": "add"
              
       ]
     
   

我试图在我的控制器文件中显示 console.log(data.assets); 以在将其传递给服务文件之前对其进行检查,但我不断收到错误 Property 'assets' does not exist on type 'DataDto'.

这是我的 DataDto.ts

export class CreateAssetsDto 
   @IsString()
   @IsOptional()
   asset_id: string;

   @ApiProperty()
   @IsString()
   asset_name: string;

   @ApiProperty(
       enum: Action
   )
   @IsEnum(Action)
   @IsNotEmpty()
   action: Action;

   @ApiProperty()
   @IsString()
   asset_type: string;

   @ApiProperty()
   @IsBoolean()
   @IsOptional()
   is_featured: boolean;

export class AssetsArrayDto 
   @ValidateNested()
   @Type(() => CreateAssetsDto)
   assets: CreateAssetsDto[];


export class DataDto 
   @ValidateNested()
   @Type(() => AssetsArrayDto)
   data: AssetsArrayDto;

这是我的 controller.ts

@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@UsePipes(new ValidationPipe( transform: true ))
@Put(':id')
async uploadAssets(
   @Request() req,
   @Param('id') campaignId: string,
   @Body() data: DataDto) 
   try 
     console.log("Data Check");
     console.log(data);

     const  assets  = data;
     console.log(data.assets[0].asset_name);
     console.log(JSON.stringify(data, null, 2));

     const a = JSON.parse(JSON.stringify(data));

     console.log(a)
     console.log(assets)

     return 
       statusCode: HttpStatus.OK,
       message: data,
     ;

    catch (error) 
     Logger.log('Validation Error: ');
     Logger.log(error);
     throw new BadRequestException(error);
   
 
 

我需要做一些我错过的事情吗?根据错误,即使我在 DTO 中指出,我的数据对象似乎也没有将资产作为其中的一部分读取。

另外,当我执行console.log(data) 时,我得到的是:

Data Check
DataDto 
 data: AssetsArrayDto  assets: [ [CreateAssetsDto], [CreateAssetsDto] ] 

【问题讨论】:

【参考方案1】:

你告诉 Typescript DataDto 有一个名为 data 的属性,它的类型是 AssetsArrayDto。你已经告诉 javascriptDataDto 的实例中提取assetsDataDto 没有 assets 属性,因此 Typescript 警告您,您尝试做的事情不正确。你需要类似的东西

@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@UsePipes(new ValidationPipe( transform: true ))
@Put(':id')
async uploadAssets(
   @Request() req,
   @Param('id') campaignId: string,
   @Body() data: DataDto) 
   try 
     console.log("Data Check");
     console.log(data);

     const  assets  = data.data;   // <-- notice the .data here
     console.log(data.assets[0].asset_name);
     console.log(JSON.stringify(data, null, 2));

     const a = JSON.parse(JSON.stringify(data));

     console.log(a)
     console.log(assets)

     return 
       statusCode: HttpStatus.OK,
       message: data,
     ;

    catch (error) 
     Logger.log('Validation Error: ');
     Logger.log(error);
     throw new BadRequestException(error);
   
 

【讨论】:

非常感谢您。它就在我眼前。你是救世主!!!!

以上是关于NestJS:无法在 console.log 中获取嵌套对象。错误:类型 Dto 上不存在属性 x的主要内容,如果未能解决你的问题,请参考以下文章

在 redux 中存储更新的值

在 Redux 的 Reducer 中更新值

即使它打印在 console.log 中,我也无法映射对象数组

无法使用 console.log 打印完整的 JSON

Chrome浏览量JS代码console.log()无法输出

我无法访问 req.body。 console.log 不打印请求对象;