Nest. js swagger - типы в dto не видны в swagger - PullRequest
0 голосов
/ 31 марта 2020

Я настраиваю свагер-документ в моем небольшом приложении Nest. js в соответствии с этой документацией: https://docs.nestjs.com/recipes/swagger

Мой вопрос: как правильно настроить dto на показать схему в чванстве? Чтобы быть более конкретным c, вложенные типы. Он показывает только ключи верхнего уровня. Если один из ключей имеет тип чего-то, он показывает его как пустой объект. Вот что я имею в виду:

dto:

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

swagger:

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

ожидаемый результат в примере значения swagger:

[
  {
    "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, он показывает это правильно в swagger.
  • Я сделал перекрестную проверку dto на интерфейс, где я добавил неправильное поле в 'isOnline', и он находит его и отмечает, что это не хорошо.
  • Схема отображается в чванстве, но также только верхний уровень, а не набранная часть. Так что это не просто пример стоимости.
  • Проверено SO :) Найдены две связанные темы, но не решена. Один предложил создать manulaly sub-dtos вместо типов. Ну ... лучше нет.

Я делаю что-то не так или что-то упустил в документации. Или, возможно, синтаксический анализатор этого модуля swagger не может извлечь тип / интерфейс при генерации json. Не знаю.

Кто-нибудь есть идеи, пожалуйста?

Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2020

Я пропустил одно место в документации:
https://docs.nestjs.com/recipes/swagger#generics -и-интерфейсы

Поскольку TypeScript не хранит метаданные об обобщениях или интерфейсах, когда вы их используете в ваших DTO SwaggerModule может не иметь возможности правильно генерировать определения модели во время выполнения.

Ну, это имеет смысл.

В некоторых спецификациях c scenar ios (например, глубоко вложенные массивы, матрицы), вы можете описать свой тип от руки.

РЕДАКТИРОВАТЬ

Итак, последняя настройка, которая работает для меня, следующая

  • Создать DTO без типов, но соответствует структуре типа / интерфейса, как в «ожидаемом результате» в исходном вопросе
  • запрос / ответ должны быть набраны с помощью dto, например, Result<SomeDto>
  • когда вы обрабатываете данные в этой функции, наберите их с интерфейсом / типом, а не с dto, и вы получите перекрестную проверку.

Как эти данные действительны, чванство генерируется правильно. Для получения дополнительной информации о чванстве используйте декораторы непосредственно в DTO.

...