0

我需要在响应中转换一些文件 URL,文件路径需要包含客户端 ID,

我有一个共享类“AssetReponseImagesDTO”,它在许多其他类中使用,我需要将filename本地路径的值转换为附加 CDN URL 和客户端 ID 并返回正确的 URL

我可以从 configService 获取 CDN URL,因为它只是一个字符串,以获取ClientId我有一个用于 nest.js 的自定义装饰器的值 - 尝试使用此装饰器访问响应中的相同 ID,但它不起作用 -似乎只是返回一个实际函数的字符串

我还尝试ClientId在我的顶级响应 DTO 上创建一个新属性,但是较低级别的类型,例如AssetResponseImagesDTO无法访问父级的属性(除非我弄错了?)

有没有办法将附加信息传递给类转换器,然后可以在转换过程中引用?

export class AssetResponseImagesDTO {
  @Expose({ name: 'url' })
  @Transform(({ value }) =>
    value ? `${configService.getCDNUrl()}${NEED_CLIENT_ID_HERE}}/asset/${value}` : null,
  )
  filename: string;

  @Expose()
  caption: string;

  @Expose({ name: 'link' })
  url: string;
}

更新了更多细节

顶层响应 DTO

export class NewVehicleDetailResponseWrapperDTO {
  @Type(() => NewVehicleResponseDTO)
  vehicle: NewVehicle;

  @Type(() => AssetResponseDTO)
  assets: Asset[];

  constructor(vehicle, assets) {
    this.vehicle = vehicle;
    this.assets = assets;
  }
}

资产响应DTO

@Exclude()
export class AssetResponseDTO {
  @Expose({ name: 'type' })
  @Transform(({ value }) => AssetType[value])
  assetType: AssetType;

  @Expose({ name: 'name' })
  scrapName: string;

  @Expose({ name: 'images' })
  @Type(() => AssetResponseImagesDTO)
  assetImages: AssetImages[];

  @Expose({ name: 'snippet' })
  @Transform(({ value }) => value?.snippet)
  @Type(() => AssetSnippets)
  assetSnippet: AssetSnippets;

  @Expose({ name: 'content' })
  @Transform(({ value }) => value?.article)
  @Type(() => AssetContents)
  assetContent: AssetContents;
}

ClientId 装饰器

export const ClientId = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();

    // We need to set the clientId either via a query param or from the logged in user.
    let clientId;
    if (request.user.clientId) {
      clientId = request.user.clientId;
    }
    if (request.headers['x-client-id']) {
      clientId = request.headers['x-client-id'];
    }

    if (!clientId) {
      throw new BadRequestException();
    }

    return clientId;
  },
);
4

0 回答 0