如何在单个Express应用中配置多份SwaggerUI文档?
在单个Express应用中配置多份Swagger UI文档
针对你使用的依赖版本(typescript: ^2.5.2、swagger-tools: ^0.10.1、express: ^4.15.3、express-openapi: ^1.0.1),可以通过为不同Swagger文档创建独立路由前缀的方式实现多份Swagger UI的配置,具体步骤如下:
1. 拆分独立的Swagger文档资源
首先把不同模块/版本的API文档拆分开,确保每份文档的全局配置和paths完全独立:
// 示例:业务模块A的Swagger文档 const swaggerDocModuleA = { openapi: '3.0.0', // 匹配你实际使用的Swagger版本 info: { title: '业务模块A API', version: '1.0.0' }, // 其他全局配置(如servers、components等) }; const pathsModuleA = { /* 模块A的接口paths定义 */ }; // 示例:业务模块B的Swagger文档 const swaggerDocModuleB = { openapi: '3.0.0', info: { title: '业务模块B API', version: '1.0.0' }, // 其他全局配置 }; const pathsModuleB = { /* 模块B的接口paths定义 */ };
2. 为每份文档初始化独立的express-openapi实例
利用Express的子路由(Router)隔离不同文档的实例,避免相互干扰:
import express from 'express'; import Openapi from 'express-openapi'; import swaggerUI from 'swagger-ui-express'; // 按你实际引入的Swagger UI包调整 // 为模块A创建子路由并初始化openapi const moduleARouter = express.Router(); const openapiModuleA = Openapi.initialize({ paths: pathsModuleA, expressApp: moduleARouter, // 绑定到子路由而非主app swaggerApiDoc: swaggerDocModuleA, }); const specModuleA = openapiModuleA.apiDoc; // 为模块B创建子路由并初始化openapi const moduleBRouter = express.Router(); const openapiModuleB = Openapi.initialize({ paths: pathsModuleB, expressApp: moduleBRouter, swaggerApiDoc: swaggerDocModuleB, }); const specModuleB = openapiModuleB.apiDoc;
3. 挂载到不同路由前缀
最后把API接口和对应的Swagger UI分别挂载到主应用的不同路径下:
// 挂载模块A的API和Swagger UI app.use('/api/module-a', moduleARouter); // 模块A的接口访问路径 app.use('/docs/module-a', swaggerUI.serve, swaggerUI.setup(specModuleA)); // 模块A的Swagger UI页面 // 挂载模块B的API和Swagger UI app.use('/api/module-b', moduleBRouter); // 模块B的接口访问路径 app.use('/docs/module-b', swaggerUI.serve, swaggerUI.setup(specModuleB)); // 模块B的Swagger UI页面
额外注意事项
- 如果你使用的是
swagger-tools自带的UI而非swagger-ui-express,可以通过swagger-tools.initializeMiddleware为每份文档生成独立的UI中间件,再绑定到对应路由; - 由于你的TypeScript版本较低(^2.5.2),遇到类型兼容问题时可以临时用
any来绕过类型检查; - 确保每份Swagger文档的
paths里的接口路径不会和其他模块的路由冲突。
内容的提问来源于stack exchange,提问作者An-droid
相关产品推荐
相关产品推荐

