Swagger e Node

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

QUe vergonha minha…

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

http://localhost:3000/api/v2/swagger-ui.html

Mas como vejo o swagger-ui ?