Nest.js挥舞着-挥舞着不可见dto中的类型

时间:2020-03-31 14:46:53

标签: javascript nestjs nestjs-swagger

我正在根据以下文档在我的小型Nest.js应用中设置摇摇欲坠的文档:https://docs.nestjs.com/recipes/swagger

我的问题是,如何设置dto以正确显示摇摇欲坠的架构?更具体地说,嵌套类型。它仅显示顶级键。如果其中一个键是某种类型的键,它将显示为空对象。这是我的意思:

dto:

export class HealthCheckDataDto {
    serverStatus: {} // dont have it typed yet;
    dbStatus: MongoConnectionStateT;
} 

大摇大摆:

[
  {
    "serverStatus": {},
    "dbStatus": {}
  }
]

大意的示例值中的预期结果:

[
  {
    "serverStatus": {},
    "dbStatus": {
      "isOnline": true,
      "msg": "string"
    }
  }
]

这是功能:

@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中将type替换为精确参数时,它会以摇摇欲坠的方式正确显示。
  • 我对dto进行了接口的交叉检查,在其中我向'isOnline'中添加了错误的字段,然后它找到并标记了它,这是不好的。
  • 模式以粗体显示,但仅以顶层显示,而不以键入的部分显示。因此,它不仅是示例值。
  • 检查了SO :)找到了两个相关的线程,但没有解决。一个建议创建manually sub-dto而不是类型。好吧...最好不要。

我做错了什么,或者错过了文档。也许那个招摇模块的解析器在生成json时无法提取类型/接口。不知道。

有人知道吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

我错过了文档中的一个地方:
https://docs.nestjs.com/recipes/swagger#generics-and-interfaces

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

嗯,很有意义。

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

编辑

因此,适用于我的最终设置如下

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

像此数据一样有效,可以正确生成摇号。有关其他摇摇欲坠的信息,请直接在DTO中使用装饰器。