规范中没有定义任何操作! - 即使设置了招摇并且定义了端点,我也会收到此错误

问题描述 投票:0回答:12

我正在尝试使用 swagger npm 包在我的节点应用程序之上设置 swagger。我的端点和招摇设置很完美(至少几乎完美),我确实对出了什么问题做了很多研究,但我找不到痕迹。 我的 swagger 设置文件:

const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const swaggerJSDoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const abc= require('./routes/abc');
var app = express();

const swaggerDefinition = {
    info: {
        title: 'Analytics Project',
        version: '1.0.0',
        description: 'Analytics API swagger documentation'
    }
};
const options = {
    swaggerDefinition,
    apis: ['./routes/abc.js']
};

const swaggerSpec = swaggerJSDoc(options);

var api = require('./routes/abc');
app.use('/', api);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use('/api/v1/abc', abc);
app.use('/api/v1/abc/scatter', abc);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
module.exports = app;

我的端点在 ./routes/abc.js 中定义:

var express = require('express');
var router = require('express').Router();
const request = require('request');

/**
 * @swagger
 * /:
 *   get:
 *     description:  Endpoint for everything
 */
router.get('/', function(req, res, next) { //End point1
    res.send('hello from dataservice');
  });

/**
 * @swagger
 * /scatter:
 *   post:
 *    description:  Endpoint for all variations of scatter plots
 */
router.post('/scatter', function(req, res, next) { //end point2
    res.json({users: [{name: 'Timmy'}]});
  });
module.exports = router;

我期待 2 个端点出现在页面上。但我得到的是“规范中没有定义操作!”错误。我缺少什么?如有任何帮助,我们将不胜感激。

swagger-ui swagger-node-express
12个回答
29
投票

您引用路线的方式可能存在问题。引用必须始终从应用程序的根目录开始。所以

'./routes/abc.js'
必须改为
'the-folder-name-in-root/routes/abc.js'


10
投票

尝试将 api 路径从

apis: ['./routes/abc.js']
更改为
apis: [`${__dirname}/routes/abc.js`]
,使其成为根文件夹的完整路径。这对我有用。


5
投票

我在 fastify 中遇到了同样的问题。 注册 swagger 后尝试

require()
您的路线。 神奇的是,它对我有用。 我的案例是:

当我在 swagger 之前注册路由时,它显示“规范中没有定义操作”:

fastify.register(require("./routes/route")); //registered routes BEFORE swagger
fastify.register(require("fastify-swagger"), {

exposeRoute: true,

routePrefix: "/docs",

swagger: {

info: { title: "SWAGGER API" },

}

});
//gave that issue with no warnings / errors in terminal or browser console

这有效:在大摇大摆之后注册路线

fastify.register(require("fastify-swagger"), {

exposeRoute: true,

routePrefix: "/docs",

swagger: {

info: { title: "SWAGGER API" },

}

});

fastify.register(require("./routes/route")); //registered routes after swagger

4
投票

像这样制作api完整路径

apis: [__filename],
它对我有用


4
投票

对我来说,当我添加

paths
时,它就起作用了,如下所示

 * @swagger
 * paths:
 *  /auth/login:
 *    post:

3
投票

我通过将 URL 从

"../api/controllers/userController.js"
更改为
"./src/api/controllers/userController.js"
解决了这个问题。 因此,您必须输入从根文件夹开始的 URL。


2
投票

在 .NET 6 中对我有帮助的是我忘记指定我正在使用控制器。这段小代码解决了我在 Program.cs 中的问题:

builder.Services.AddControllers();

1
投票

也许如果您使用类似的配置,您需要指定项目“my.root.package”的根包

@Bean
public Docket productApi(){
return new Docket(DocumentationType.SWAGGER_2).select()
           .apis(RequestHandlerSelectors.basePackage("my.root.package")).build();
        }

1
投票

在 .NET 6 中不要忘记添加

app.MapControllers();

随着

builder.Services.AddControllers();

(如系统调用所述)


1
投票

始终从应用程序的根目录开始引用。

路径

const path = require('path');

const options = {
    definition: {},
    apis: [path.join(process.cwd(), '/routes/*.routes.js')], 
};

0
投票

我遇到了同样的错误,我能够立即解决它,我意识到我引用了错误的包。

@Bean
public Docket api() {
   return new Docket(DocumentationType.SWAGGER_2)
      .select()
      .paths(PathSelectors.any())
      .apis(RequestHandlerSelectors.basePackage("com.korede.liberations"))
      .build()
      .apiInfo(apiDetails());
}

以防万一有人遇到同样的问题,请检查您在

中引用的包

RequestHandlerSelectors.basePackage()


0
投票

就我而言,问题出在包裹上。 我使用 springBoot 和 eclipse STS 作为 IDE。 Swagger 没有读取控制器。 我必须从基础包重新创建每个包。 将右侧按钮拉到基础包上,然后选择新包。 逐个。 最后我将每个类移动到它的包中。 当我运行时,swagger 会正确显示端点。

© www.soinside.com 2019 - 2024. All rights reserved.