#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. Большое вам за это спасибо. Это было прямо у меня перед глазами. Ты-спаситель!!!!