为什么 Swagger 不使用完整路由发出 API 请求?

ayo*_*oin 1 node.js express swagger

当我使用 swagger UI 发出请求时,它使用错误的 URL,但是当我在浏览器上发出请求并使用 http://localhost:8080/client/getRecord/?id=j9jSeEYJOjWWp6V5EHP0 时,它工作得很好,因为它有“/client”路线,但在 Swagger 上没有。

\n

在此输入图像描述

\n

对于上下文,这是我的index.js代码:

\n
const express = require(\'express\');\nconst app = express();\nconst cors=require(\'cors\');\nconst bodyParser = require(\'body-parser\');\nconst config = require("./config");\nconst swaggerUi = require(\'swagger-ui-express\')\nconst swaggerFile = require(\'./swagger/swagger_output.json\')\n\n// Defini\xc3\xa7\xc3\xa3o de rotas\nconst authRoutes = require(\'./routes/auth-routes\');\nconst arduinoRoutes = require(\'./routes/arduino-routes\');\n\nconst clientRoutes = require(\'./routes/client-routes\');\n\napp.use(\'/arduino\', arduinoRoutes);\napp.use(\'/auth\', authRoutes);\napp.use(\'/client\', clientRoutes);\n\napp.listen(config.port, () => console.log(\'App is listening on url \' + config.url));\n\napp.use(\'/doc\', swaggerUi.serve, swaggerUi.setup(swaggerFile, {explorer:true}));\n\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的client-routes.js

\n
const express = require(\'express\');\nconst firebase = require(\'../db\');\nconst Student = require(\'../models/record\');\nconst firestore = firebase.firestore();\n\nconst router = express.Router();\n\nrouter.get(\'/getRecord\', (req, res) => {\n    // #swagger.tags = [\'Client\']\n    // #swagger.summary = "Get a single record from DB through its Id"\n    try {\n        recordId = req.query.id;\n\n        firestore.collection(\'ToDoList\').doc(recordId).get().then(function (doc) {\n            console.log(doc.data().humidade);\n        });\n\n        res.status(200).send(doc.data())\n    } catch (error) {\n        res.status(400).send(error.message);\n    }\n});\nmodule.exports = router;\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 swagger_output.json:

\n
{\n  "swagger": "2.0",\n  "info": {\n    "version": "1.0.0",\n  },\n  "host": "localhost:8080",\n  "basePath": "/",\n  "schemes": [\n    "http"\n  ],\n  "paths": {\n    "/getRecord": {\n      "get": {\n        "tags": [\n          "Client"\n        ],\n        "summary": "Get a single record from DB through its Id",\n        "description": "",\n        "parameters": [\n          {\n            "name": "id",\n            "in": "query",\n            "type": "string"\n          }\n        ],\n        "responses": {\n          "200": {\n            "description": "OK"\n          },\n          "400": {\n            "description": "Bad Request"\n          }\n        }\n      }\n    },\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我通过这个脚本swagger.js创建的,使用swagger-autogen

\n
const swaggerAutogen = require(\'swagger-autogen\')()\n\nconst outputFile = \'./swagger/swagger_output.json\'\nconst endpointsFiles = [\'./routes/arduino-routes.js\', \'./routes/auth-routes.js\', \'./routes/client-routes.js\']\n\nconst doc = {\n    info: {\n        version: "1.0.0",\n    },\n    "host": "localhost:8080",\n}\n\nswaggerAutogen(outputFile, endpointsFiles, doc).then(() => {\n    require(\'../index.js\')\n});\n
Run Code Online (Sandbox Code Playgroud)\n

我究竟做错了什么?为什么 swagger 没有获取完整的 /client/getRecord 路由?

\n

gri*_*eel 5

您正在设置endpointsFiles所有路由器文件的列表。Swagger 不知道路由器安装在/.

不要传入路由器列表,而是传入文件index.js,其中包含有关路由器安装位置的信息:

const endpointsFiles = ['./index.js'];
Run Code Online (Sandbox Code Playgroud)