Как использовать контроллеры маршрутизации с пользовательским интерфейсом swagger?

#express #swagger-ui #routing-controllers

#экспресс #swagger-ui #контроллеры маршрутизации

Вопрос:

я не понимаю, как использовать swagger-ui с контроллером маршрутизации.

я пробовал:

 @Controller('/api-docs')
@UseBefore(swagger.serve) //ERROR No overload matches this call
class SwaggerController {
  
  @Get('/')
  @UseBefore(swagger.setup(swaggerJson))
  public swaggerUi(): void {}
}
 

но я получил ошибку (перегрузка не соответствует этому вызову) для swagger.serve.

Теперь я сделал это так:

 // server.ts
const app = express();

useExpressServer(app, {/* controllers, middlewares, options */});

app.use('/api-docs', swagger.serve, swagger.setup(swaggerJson));
 

это работает, но это неправильная реализация (я думаю)

Как использовать существующие промежуточные программы для этих случаев?

Ответ №1:

Похоже, это правильная реализация, как рекомендовано в документации swagger-ui-express.

Как описано в документации по контроллерам маршрутизации, вы можете предварительно настроить приложение Express с помощью обычных промежуточных программ Express, а затем настроить контроллеры маршрутизации с помощью useExpressServer(app, ...

Нет необходимости создавать какой-либо выделенный контроллер, просто добавьте его в качестве function промежуточного программного обеспечения

Я использую проект Routing-Controller / Express typescript, и я настроил Swagger таким образом (используя файл YML OpenAPI, но может быть и JSON), за исключением того, что я настраиваю express ПЕРЕД настройкой контроллеров маршрутизации:

 import * as swaggerUi from "swagger-ui-express";
import * as YAML from "yaml";
...

{
    const app = express();
    ...
    // load YML Swagger spec
    const buf = await fs.promises.readFile(path.join(__dirname, "../install/openapi.yml"));
    const openApi = YAML.parse(buf.toString());
    // setup swaggerUI as Express middleware
    app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(openApi));

    // then setup routing-controller
    useExpressServer(app, { ...
    ...
}