Estou tentando fazer o swagger e o node funcionar
package.json
"swagger-autogen": "^2.18.8",
"swagger-ui-express": "^4.3.0",
no app.js
const swaggerUi = require('swagger-ui-express');
const swaggerFile = require('./swagger/swagger_output.json');
app.use(logger("dev"), swaggerUi.serve, swaggerUi.setup(swaggerFile));
Ao executar o npm start, ele mostra o erro
[nodemon] 2.0.15
[nodemon] to restart at any time, enter `rs`
^
Error: Cannot find module './swagger/swagger_output.json'
Require stack:
- C:\sistemas\zanzar\zanzar-api\api\app.js
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (C:\sistemas\zanzar\zanzar-api\api\app.js:8:21)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [ 'C:\\sistemas\\zanzar\\zanzar-api\\api\\app.js' ]
}
[nodemon] app crashed - waiting for file changes before starting...
Entendo que está faltando o arquivo ./swagger/swagger_output.json, mas como faço para executar e configurar ?
Nunca usei esse pacote, mas pelo que entendi pela documentação, em vez de criar o json, vc pode usar a swagger-jsdoc:
// Initialize swagger-jsdoc -> returns validated swagger spec in json format
const swaggerSpec = swaggerJSDoc(options);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
Exemplo das options (tem no link da documentação do swaggerJSDoc
:
const swaggerJsdoc = require('swagger-jsdoc');
const options = {
definition: {
openapi: '3.0.0',
info: {
title: 'Hello World',
version: '1.0.0',
},
},
apis: ['./src/routes*.js'], // files containing annotations as above
};
Pelo que entendi, esse pacote lê os dados dos endpoints que possuem:
/**
* @openapi
* /:
* get:
* description: Welcome to swagger-jsdoc!
* responses:
* 200:
* description: Returns a mysterious string.
*/
app.get('/', (req, res) => {
res.send('Hello World!');
});
1 curtida
Dá este erro
C:\sistemas\zanzar\zanzar-api\api\app.js:46
app.use("/api/" + version, versionRoutes, swaggerUi.serve, swaggerUi.setup(swaggerSpec));
ReferenceError: swaggerUi is not defined
at C:\sistemas\zanzar\zanzar-api\api\app.js:46:45
at Array.forEach (<anonymous>)
at Object.<anonymous> (C:\sistemas\zanzar\zanzar-api\api\app.js:44:10)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
[nodemon] app crashed - waiting for file changes before starting...
Vc removeu essa linha:
const swaggerUi = require('swagger-ui-express');
?
1 curtida
[nodemon] starting `node ./api/app.js zanzar-api`
C:\sistemas\zanzar\zanzar-api\api\app.js:22
const swaggerSpec = swaggerJSDoc(options);
^
ReferenceError: swaggerJSDoc is not defined
at Object.<anonymous> (C:\sistemas\zanzar\zanzar-api\api\app.js:22:21)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
[nodemon] app crashed - waiting for file changes before starting...
Vc declarou:
const swaggerJsdoc = require('swagger-jsdoc');
?
1 curtida
const express = require("express");
const logger = require("morgan");
const bodyParser = require("body-parser");
const cors = require("cors");
const validator = require("express-validator");
const helmet = require("helmet");
const swaggerUi = require('swagger-ui-express');
const swaggerJsdoc = require('swagger-jsdoc');
const options = {
definition: {
openapi: '3.0.0',
info: {
title: 'Hello World',
version: '1.0.0',
},
},
apis: ['./src/routes*.js'], // files containing annotations as above
};
const swaggerSpec = swaggerJSDoc(options);
Repare que o case está diferente:
import: swaggerJsdoc
uso: swaggerJSDoc
1 curtida
Nada sô, acontece. Já perdi horas num problema que era causado por um ponto-e-virgula kkkkk
1 curtida
No java, eu acesso assim: http://localhost:9600/s3-amazon-api/swagger-ui.html#/
No node, estou tentando acessar assim: http://localhost:3000/api/v2/swagger-ui.html. O sistema acesso assim:http://localhost:3000/api/v2/dashboard/listar-campanhas
Configuração do node.
const options = {
definition: {
openapi: "3.0.0",
info: {
title: "Zanzar",
version: "v2",
},
},
apis: ["/api/V2"],
};
const swaggerSpec = swaggerJsdoc(options);
versions.forEach((version) => {
const versionRoutes = require("./" + version + "/routes");
app.use(
"/api/" + version,
versionRoutes,
swaggerUi.serve,
swaggerUi.setup(swaggerSpec)
);
});
Nas options
, em apis
, vc deve informar os arquivos onde os endpoints estão declarados e devidamente comentadados de acordo com a documentação da swaggerJsdoc
.
No exemplo da documentação está assim:
apis: ['./src/routes*.js'], // veja que é o caminho dos arquivos onde estão as rotas (os endpoints no caso)
A url a ser acessada deve ser a definida aqui:
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
^
1 curtida
Sim, no caso, o sistema ele tem as rotas definidas por aqui
As rotas estão na pasta V2/routes.js
E aqui está asim:
const router = require("express").Router();
const { lstatSync, readdirSync } = require("fs");
const { join } = require("path");
readdirSync(__dirname)
.filter(function (item) {
return lstatSync(join(__dirname, item)).isDirectory();
})
.forEach(function (item) {
router.use("/" + item, require("./" + item + "/routes"));
});
router.use("/test", (req, res) => {
res.status(200).json(req.headers);
});
module.exports = router;
Parece que o swaggerJsDoc
usa um padrão no comentário para montar as coisas, como nesse exemplo:
/**
* @openapi
* /:
* get:
* description: Welcome to swagger-jsdoc!
* responses:
* 200:
* description: Returns a mysterious string.
*/
app.get('/', (req, res) => {
res.send('Hello World!');
});
1 curtida
Assim
/**
* @openapi
* /:
* get:
* description: Lista todas as campanhas
* responses:
* 200:
* description: Returns a mysterious string.
*/
router.get("/listar-campanhas", [], controller.listarCampanhas);