NestJS: Не удается получить вложенный объект в console.log. Ошибка: Свойство x не существует для типа Dto

#javascript #typescript #controller #nestjs #dto

#язык JavaScript #машинописный текст #контроллер #гнездышко #dto

Вопрос:

по какой-то причине я не могу заставить вложенный объект отображаться в журнале моей консоли. Уже около дня пытаюсь найти решение.

Вот мой 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'.

Вот мои данные.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(() =gt; CreateAssetsDto)  assets: CreateAssetsDto[]; }  export class DataDto {  @ValidateNested()  @Type(() =gt; AssetsArrayDto)  data: AssetsArrayDto; }  

Вот мой контроллер.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 . Вы сказали JavaScript, чтобы удалить assets экземпляр DataDto . DataDto не имеет 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; // lt;-- 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);  }  }  

Комментарии:

1. Большое вам за это спасибо. Это было прямо у меня перед глазами. Ты-спаситель!!!!