首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么dto中的类型在swagger中不可见?

为什么dto中的类型在swagger中不可见?
EN

Stack Overflow用户
提问于 2020-03-31 14:46:53
回答 3查看 17.1K关注 0票数 11

我正在我的小型Nest.js应用程序中设置swagger文档,根据下面的文档:https://docs.nestjs.com/recipes/swagger

如何设置do以便在swagger中正确显示架构?更具体地说,嵌套类型。它只显示顶级键。如果其中一个键是某物的类型,它就将其显示为空对象。我的意思是:

dto:

代码语言:javascript
运行
复制
export class HealthCheckDataDto {
    serverStatus: {} // dont have it typed yet;
    dbStatus: MongoConnectionStateT;
} 

狂妄自大:

代码语言:javascript
运行
复制
[
  {
    "serverStatus": {},
    "dbStatus": {}
  }
]

预期的结果,例如,虚张声势

代码语言:javascript
运行
复制
[
  {
    "serverStatus": {},
    "dbStatus": {
      "isOnline": true,
      "msg": "string"
    }
  }
]

这是一项功能:

代码语言:javascript
运行
复制
@ApiResponse({ status: 200, description: 'blabla', type: [HealthCheckDataDto] })
@ApiResponse({ status: 500, description: 'blabla, but bad', type: [HealthCheckDataDto] })
@Get('/api/healthcheck')
healthCheckApp(@Res() res: Response<HealthCheckDataDto>) {

    // check HCs and setup status code
    const healthCheck: HealthCheckI = this.healthcheckService.getFullHealthCheck();
    const statusCode = (healthCheck.dbStatus.isOnline) ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR;

    // return that response
    res.status(statusCode).json(healthCheck);
}

我试过的是:

  • 当我在dto中替换类型为精确的参数时,它正确地显示在swagger中。
  • 我在界面上交叉检查了dto,在'isOnline‘中添加了错误的字段,它会找到它并标记它,它不是很好。
  • 架构显示在swagger中,但也仅显示在顶层,而不是类型化部分。所以这不仅仅是一个例子。
  • 检查堆栈溢出;找到两个相关线程,但两个线程都没有解决。有人建议手动创建子dtos而不是类型。好吧..。我最好别那么做。

我做错了什么,或者在文档中漏掉了什么。或者,这个swagger模块的解析器在生成json时无法提取类型/接口。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-01 07:52:20

我错过了NestJS文档:泛型和接口的一个位置

由于TypeScript不存储有关泛型或接口的元数据,所以当您在DTO中使用它们时,SwaggerModule可能无法在运行时正确地生成模型定义。

嗯,这说得通。

在某些特定情况下(例如,深度嵌套数组、矩阵),您可能需要手动描述您的类型。

因此,对我起作用的最终设置如下

  • 创建没有类型的DTO,但是匹配类型/接口结构,就像在原始问题中的“预期结果”中一样
  • 请求/响应应输入dto (如Result<SomeDto> )
  • 当您在该函数中处理数据时,请使用接口/类型(而不是dto )键入它,然后进行交叉检查。

就像这些数据是有效的一样,swagger也是正确生成的。对于更多的装潢信息,直接在DTO中使用装饰器。

票数 8
EN

Stack Overflow用户

发布于 2021-10-06 13:12:59

您可以使用OpenAPI CLI插件自动显示Swagger中的类型。

添加:

代码语言:javascript
运行
复制
  "compilerOptions": {
    "plugins": ["@nestjs/swagger"]
  }

添加到nest-cli.json中,并添加:

代码语言:javascript
运行
复制
import { ApiProperty, ApiBody } from '@nestjs/swagger';

对您的每个DTO,插件将自动注释和记录您的模式!

票数 5
EN

Stack Overflow用户

发布于 2022-01-02 03:09:23

根据类型和参数的文档,您只需使用

代码语言:javascript
运行
复制
@Body(), @Query(), @Param()

然后,swagger模块将自动为您填充东西。这还要求您将nest-cli.json文件更新为

代码语言:javascript
运行
复制
{
"collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "plugins": ["@nestjs/swagger/plugin"]
  }
}

那么所有的事情都应该为你去做和创造。

只要提醒一下,如果这没有自动显示它们或显示模式为空,那么您就可以使用@ApiProperty()将至少一个dto条目解压缩,然后刷新页面。这会把事情做好的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60953406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档