2
votes

swagger-ui-express Routes multiples pour la documentation API différente

J'ai 2 documentations d'API swagger distinctes que je souhaite exécuter via le package NPM swagger-ui-express, et mon serveur express démarre correctement sur le port 5000, mais lorsque j'essaie d'accéder à l'une des URL, j'obtiens toujours le 404 erreur, voici mon fichier app.js et mes URL pour votre référence:

Route 1: http: // localhost: 5000 / edi Route 2: http: // localhost: 5000 / ecom

const express    = require('express');
const router     = require('express').Router();
const swaggerUi  = require('swagger-ui-express');

const ediSwaggerDocument  = require('./edi-openapi.json');
const ecomSwaggerDocument = require('./ecom-openapi.json');

const SWAGGER_APP_PORT = process.env.SWAGGER_APP_PORT || 5000;

const app = express();

// Route Middleware to be called before serving Any Route
router.use('/', swaggerUi.serve); 

// Route - EDI RESTful API Documentaion 
router.get('/edi', swaggerUi.setup(ediSwaggerDocument)); 

// Route - eCommerce RESTful API Documentaion 
router.get('/ecom', swaggerUi.setup(ecomSwaggerDocument));

app.listen(SWAGGER_APP_PORT, () => console.log(`RESTful API Up and Running on Port ${SWAGGER_APP_PORT}`));


2 commentaires

pouvez-vous s'il vous plaît fournir vos fichiers de configuration


@luvcoding Avez-vous trouvé la solution pour cela?


4 Réponses :


-1
votes

Il semble que le Router soit mal utilisé. Pour ce cas d'utilisation simple, je recommanderais d'ajouter vos itinéraires directement à l'instance app . Voir:

// Route - EDI
router.get('/edi', swaggerUi.setup(ediSwaggerDocument)); 

// Route - eCommerce 
router.get('/ecom', swaggerUi.setup(ecomSwaggerDocument));

// Adding it to App instance
app.use('/swagger', router)

// End Point =>     localhost:5000/swagger/edi

Maintenant, vous pouvez utiliser le Router en l'ajoutant à l'instance app avec app.use () . Voir:

const express    = require('express');
// xxxx const router     = require('express').Router();
const swaggerUi  = require('swagger-ui-express');

const ediSwaggerDocument  = require('./edi-openapi.json');
const ecomSwaggerDocument = require('./ecom-openapi.json');

const SWAGGER_APP_PORT = process.env.SWAGGER_APP_PORT || 5000;

const app = express();

// Route Middleware to be called before serving Any Route
app.use('/', swaggerUi.serve); // replaced router with app

// Route - EDI RESTful API Documentaion 
// REPLACED "router" with "app"
app.get('/edi', swaggerUi.setup(ediSwaggerDocument)); 
// Route - eCommerce RESTful API Documentaion 
// REPLACED "router" with "app"
app.get('/ecom', swaggerUi.setup(ecomSwaggerDocument));

app.listen(SWAGGER_APP_PORT, () => console.log(`RESTful API Up and Running on Port ${SWAGGER_APP_PORT}`));

J'espère que cela vous aidera !!


1 commentaires

Merci pour votre suggestion et je l'ai déjà essayé. Dans ce cas, il affiche simplement la page vierge (lors du remplacement de l'itinéraire par l'application), obtenant l'erreur http 304. Les fichiers de configuration edi_openapi.json et ecom_openapi.json sont trop volumineux et ne peuvent pas être collés dans les commentaires en raison de la limitation de taille



1
votes
router.use('/jobs/api/:id',swaggerUi.serve,(req,res)=>{
console.log("here")
let a = req.params.id
if(a==='all'){ res.status(200).send(swaggerUi.generateHTML(swaggerDocument))}
if(a==='google'){res.status(200).send(swaggerUi.generateHTML(GoogleAds)) }
});

2 commentaires

Bien que cet extrait de code puisse être la solution, incluant un l'explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.


cela ne fonctionne pas ... il redirige toujours vers l'url swagger par défaut



2
votes

Essayez les configurations suivantes pour accrocher swaggerUi avec express-app

app.use("/edi", swaggerUi.serve, (...args) => swaggerUi.setup(ediSwaggerDocument)(...args));
app.use("/ecom", swaggerUi.serve, (...args) => swaggerUi.setup(ecomSwaggerDocument)(...args));



0 commentaires

2
votes

Je n'ai pas assez creusé dans le swagger-ui-express mais je pense que le problème vient de la fonction generateHTML (appelée dans swaggerUi.setup ). Une variable de module globale ( swaggerInit ) est mise à jour lorsqu'elle est appelée.

Le dernier appel à generateHTML a des effets secondaires sur toutes les routes qui utilisent swaggerUi.setup middleware.

Une solution rapide consiste à générer du HTML chaque fois que la route est appelée. Selon l'extrait de code que vous fournissez, cela devrait ressembler à:

 let swaggerDocEdi = require('./edi-openapi.json');
 let swaggerDocEcom= require('./ecom-openapi.json');
 let router = express.Router();

 router.use('/api/edi', swagger.serve, (req, res) => {
     let html = swagger.generateHTML(swaggerDocEdi);
     res.send(html);
 });

 router.use('/api/ecom', swagger.serve, (req, res) => {
     let html = swagger.generateHTML(swaggerDocEcom);
     res.send(html);
  });

Notez que la variable globale est toujours mise à jour.

p>


0 commentaires