我需要在响应中转换一些文件 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;
},
);