#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, { ...
...
}