Multiple swaggerUi with a single express app Multiple swaggerUi with a single express app express express

Multiple swaggerUi with a single express app


A year late, but still valid:

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);

With useSwaggerMiddlewares defined here

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);    }  });};


You can host multiple apis on a single express server, you just have to be sure basePath doesn't overlap each other.

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

swaggerTools.initializeMiddleware(doc1, function (mw1) {  // Do stuff with first middleware  swaggerTools.initializeMiddleware(doc2, function (mw2) {    // Do stuff with second middleware    // Repeat...  });});

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