首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用单个express应用程序实现多个swaggerUi

使用单个express应用程序实现多个swaggerUi
EN

Stack Overflow用户
提问于 2018-01-19 18:47:32
回答 2查看 1.5K关注 0票数 8

我正在尝试寻找一种解决方案,可以在一个express应用程序中拥有多个swaggerUi文档。

我使用的是:

代码语言:javascript
复制
"typescript": "^2.5.2",
"swagger-tools": "^0.10.1",
"express": "^4.15.3",
"express-openapi": "^1.0.1",

我的swagger文档文件部分是由项目文件架构生成的。

我该怎么做呢?

编辑

现在,我像这样初始化swaggerUi:

代码语言:javascript
复制
const openapi = Openapi.initialize({
    paths: openApiPaths,
    expressApp,
    swaggerApiDoc,
  });
const openApiSpec: any = openapi.apiDoc;
app.use(swaggerUI(openApiSpec));

其中openApiPaths包含swagger文档的paths:{}

EN

回答 2

Stack Overflow用户

发布于 2019-09-17 21:54:17

晚了一年,但仍然有效:

代码语言:javascript
复制
async function initialize (app) {

  const authenticationSpec = path.join(__dirname,'api/authentication.yaml');
  const authenticationMiddleware = await useSwaggerMiddlewares(authenticationSpec, {
    router: routerOptions,
    validator: validatorOptions,
  });
  // NOTE the metadata must be mounted at root level!
  app.use(authenticationMiddleware.metadata);
  app.use('/v2/authentication', authenticationMiddleware.validator);
  app.use('/v2/authentication', authenticationMiddleware.router);
  app.use('/v2/authentication', authenticationMiddleware.ui);

  const mainSpec = path.join(__dirname,'api/swagger.yaml');
  const mainMiddleware = await useSwaggerMiddlewares(mainSpec, {
    router: routerOptions,
    validator: validatorOptions,
  });
  app.use(mainMiddleware.metadata);
  app.use(mainMiddleware.validator);
  app.use(mainMiddleware.router);
  app.use(mainMiddleware.ui);

  // Start the server
  http.createServer(app).listen(serverPort, () => console.log(`server lintening on port ${serverPort}`);
}

initialize(app);

使用此处定义的useSwaggerMiddlewares

代码语言:javascript
复制
module.exports = function useSwaggerMiddlewares (swaggerSpec, {
  router: routerOptions, validator: validatorOptions,
}) {
  return new Promise((resolve, reject) => {
    try {
      // The Swagger document (require it, build it programmatically, fetch it from a URL, ...)
      const spec = fs.readFileSync(swaggerSpec, 'utf8');
      const swaggerDoc = jsyaml.safeLoad(spec);

      // Initialize the Swagger middleware
      swaggerTools.initializeMiddleware(swaggerDoc, (middleware) => {
        try {
          return resolve({
            // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
            metadata: middleware.swaggerMetadata(),
            // Validate Swagger requests
            validator: middleware.swaggerValidator(validatorOptions),
            // Route validated requests to appropriate controller
            router: middleware.swaggerRouter(routerOptions),
            // Serve the Swagger documents and Swagger UI
            ui: middleware.swaggerUi()
          });
        } catch (error) {
          console.error(error);
          return reject(error);
        }
      });
    } catch (error) {
      console.error(error);
      return reject(error);
    }
  });
};
票数 1
EN

Stack Overflow用户

发布于 2018-01-23 17:42:05

您可以在一台express服务器上托管多个apis,您只需确保basePath不会相互重叠即可。

参考:https://github.com/apigee-127/swagger-tools/issues/530

代码语言:javascript
复制
swaggerTools.initializeMiddleware(doc1, function (mw1) {
  // Do stuff with first middleware

  swaggerTools.initializeMiddleware(doc2, function (mw2) {
    // Do stuff with second middleware

    // Repeat...
  });
});

参考:https://github.com/apigee-127/swagger-tools/issues/513

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

https://stackoverflow.com/questions/48339325

复制
相关文章

相似问题

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