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
。你已经告诉 javascript 从DataDto
的实例中提取assets
。 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; // <-- 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的主要内容,如果未能解决你的问题,请参考以下文章
即使它打印在 console.log 中,我也无法映射对象数组