NestJs/swagger:定义没有DTO类的ref模式

NestJs/swagger:定义没有DTO类的ref模式,nestjs,nestjs-swagger,Nestjs,Nestjs Swagger,我有一个应用程序,我根据开放式API规范将API响应模式定义为普通javascript对象。目前,我正在将其传递给@nestjs/swagger中的ApiResponsedecorator,如下所示: 类CATS控制器{ @得到() @蜂群反应({ 现状:200, schema:catSchema//plain从另一个文件导入的js对象 }) getAll(){} } 这很有效。但是,输出openapi规范包含每个使用catSchema的端点的详细模式相反,我希望输出的swagger文件在组件

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

类CATS控制器{
@得到()
@蜂群反应({
现状:200,
schema:catSchema//plain从另一个文件导入的js对象
})
getAll(){}
}
这很有效。但是,输出openapi规范包含每个使用
catSchema
的端点的详细模式相反,我希望输出的swagger文件在
组件
部分下有catSchema,在路径部分有相应的
$ref

组件:
模式:
类别:
特性:
姓名:
类型:字符串
路径:
/猫/{id}:
获取:
响应:
'200':
内容:
应用程序/json:
模式:
$ref:“#/components/schemas/Cat”
到目前为止,唯一的方法似乎是将模式定义为DTO类,并对每个类属性使用
ApiProperty
decorator。在我的例子中,这意味着我必须将OpenAPI规范中的所有普通对象模式重构为DTO类

有没有办法将原始模式提供给库并获得预期结果

//而不是这个:
CatDto类{
@ApiProperty()
名称:字符串;
}
//我想做:
常量catSchema={
类型:“对象”,
特性:{
名称:{type:'string'}
}
}

经过几天又几天的反复试验,我用Javascript中一个有趣的技巧成功了

首先,我将openapi规范创建为一个普通对象(如问题中所问)。然后把它交给了一个新的装饰师,魔法就在那里发生了

在decorator中,我创建了一个具有预定义名称的DTO类,并将属性从普通对象映射到DTO类。棘手的部分是动态地给它命名。这可以通过以下技术实现

const dynamicName='foo';//作为参数传递给装饰器
中级班{
@ApiProperty(schema)//作为普通对象的架构
资料:有;
}
常量代理对象={
[dynamicName]=类扩展到{}
}

通过使用代理对象,并将
类extends IntermediateDTO{}
分配给其中的属性,条目将动态获取名称。现在,这个带有动态名称的新DTO可以传递给
@nestjs/swagger
ApiResponse
装饰器,以实现预期的结果。

简而言之,这背后的原因是:
@ApiProperty
是nestjs中swagger理解模式的标记,而内联模式设计不支持它。您能更详细地解释一下如何传递模式吗?谢谢@TanmoyBhattacharjee的回复。我想直接将内联模式传递给
@apiressponse
。它工作得很好,只是它不做
$ref
模式。输出包含直接位于responses部分下的模式。这有意义吗?