将axios响应数据反序列化为类示例

rsaldnfx  于 2023-03-29  发布在  iOS
关注(0)|答案(1)|浏览(156)

1.我正在使用axios(NestJs应用程序)访问外部API。
1.我指定了响应类型(假设为ResponseDto
1.当我从axios(response.data)获取数据时,它是一个简单的纯JS对象。因此,我不能使用我在ResponseDto类中定义的任何函数。因此,我得到错误TypeError: response.data.isValid is not a function
响应类别:

import { InfoDto } from './info.dto';
import { Type } from 'class-transformer';

export class ResponseDto {
  @Type(() => InfoDto)
  private infos: InfoDto[];

  isValid(): boolean {
    return this.infos.length > 0;
  }
}

信息DTO

export class InfoDto {
  private readonly message: string;

  isMessageEmpty(): boolean {
    return !this.message;
  }
}

API调用

this.httpService.axiosRef
.post<ResponseDto>(apiUrl, request, {
  headers: headers,
})
.then((response) => response.data);

我希望response.data的类型是ResponseDto,但它是一个Object。

Object {
         "infos": Array(1)[
           Object {
             "message": "message"
           }
         ]
       }

我想要的

ResponseDto {
         "infos": Array(1)[
           InfoDto {
             "message": "message"
           }
         ]
       }
zrfyljdw

zrfyljdw1#

您需要使用类似class-transformer的东西将JSON对象放入类示例中,或者通过示例化新类并分配属性来手动完成。

this.httpService.axiosRef
.post<ResponseDto>(apiUrl, request, {
  headers: headers,
})
.then((response) => response.data)
.then((data) => plainToInstance(ResponseDto, data))
.then((instance) => {
  if (!instance.isValid) {
    throw new Error('Invalid data from third party API);
  }
  return instance;
});

这些也可以组合成相同的then,只是为了示例的目的将它们分开。

相关问题