gpt4 book ai didi

NestJs/招摇 : Define ref schemas without DTO classes

转载 作者:行者123 更新时间:2023-12-04 14:11:20 25 4
gpt4 key购买 nike

我有一个应用程序,我根据 open-api 规范将 API 响应模式定义为普通的 javascript 对象。目前我正在将其传递给 ApiResponse @nestjs/swagger 中的装饰器如下:

class CatsController {

@Get()
@ApiResponse({
status: 200,
schema: catSchema // plain js object imported from another file
})
getAll() {}
}
这很好用。但是,输出 open-api 规范包含使用 catSchema 的每个端点的详细模式。 . 相反,我希望输出 swagger 文件在 components 下具有 catSchema部分,并有相应的 $ref在路径部分。
components:
schemas:
Cat:
properties:
name:
type: string
paths:
/cats/{id}:
get:
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Cat'
到目前为止,似乎唯一的方法是将模式定义为 DTO 类并使用 ApiProperty每个类属性的装饰器。就我而言,这意味着我必须将 open-api 规范中的所有普通对象模式重构为 DTO 类。
有没有办法将原始模式提供给库并获得预期的结果?
// instead of this:
class CatDto {
@ApiProperty()
name: string;
}

// I want to do:
const catSchema = {
type: 'object',
properties: {
name: { type: 'string' }
}
}

最佳答案

经过几天的反复试验,我能够使用 Javascript 中的一个有趣的技巧来解决这个问题。
首先,我将 open-api 规范创建为一个普通对象(如问题中所问)。然后将它传递给一个新的装饰器,魔法就在那里发生。
在装饰器中,我创建了一个具有预定义名称的 DTO 类,并将属性从普通对象映射到 DTO 类。棘手的部分是动态地给它一个名字。这可以通过以下技术实现。

const dynamicName = 'foo'; // passed as a parameter to the decorator

class IntermediateDTO {
@ApiProperty(schema) // schema as a plain object
data: any;
}

const proxyObject = {
[dynamicName] = class extends IntermediateDTO {}
}
通过使用代理对象,并分配 class extends IntermediateDTO {}到一个属性,该条目动态获取一个名称。现在这个具有动态名称的新 DTO 可以传递给 ApiResponse @nestjs/swagger 的装饰师以达到预期的效果。

关于NestJs/招摇 : Define ref schemas without DTO classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63978639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com