POST 未收到 Swagger3.0/OpenAPI 参数

POST parameters not received Swagger3.0/OpenAPI

我正在使用 Swagger 3.0/OpenAPI 编写一个网站来描述我的 API,Node.js 用于后端。 我成功地使 GET 请求工作,但我在处理所有 POST 请求时遇到了一些问题。 问题是我在执行 POST 请求时从 HTML 表单提供的参数似乎没有被 /controllers 文件夹中的 Swagger 处理程序自动生成。特别是,HTTP 请求对象的 req.swagger.params 数组和 req.swagger.params['body'] 子字段(应该包含参数)始终为空。

我尝试同时使用 'application/x-www-form-urlencoded' 和 'application/json' 作为 ContentType;我尝试了不同的源来执行请求,例如SwaggerUI、Postman、前端网页和CURL;我尝试了 FetchAPI 和 JQuery AJAX ($.post 和 $.ajax).

这是我在 Register.js 中执行 POST 请求的方式:

event.preventDefault();

var firstname = $('#inputFirstname').val();
var lastname = $('#inputLastname').val();
var email = $('#inputEmail').val();
var psw = $('#inputPassword').val();

var data = {
    'firstname': firstname,
    'lastname': lastname,
    'email': email,
    'password': psw
};

$.ajax({
    url: '/user/register',
    type: 'POST',
    dataType: 'text', // also tried json
    contentType: 'application/x-www-form-urlencoded', //also tried json
    data: data
       }
)
 .done(successScreen)
 .fail(() => console.log('Fail'));

这是我在 swagger.yaml 中描述我的 API 的方式:

(...)
/user/register:
    post:
      tags:
      - user
      summary: Create a new user.
      description: Register into the store.
      operationId: userRegisterPOST
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/RegisterBody'
      responses:
        201:
          description: succesfull registration
          content: {}
      x-swagger-router-controller: User
(...)
RegisterBody:
      required:
      - email
      - firstname
      - lastname
      - password
      type: object
      properties:
        email:
          type: string
        password:
          type: string
        firstname:
          type: string
        lastname:
          type: string

这是 /controllers/User.js 中为 /user/register 上的 POST 请求自动生成的处理程序:

49:module.exports.userRegisterPOST = function userRegisterPOST (req, res){
50:  var body = req.swagger.params['body'].value; // here it's where I get the error, but it's auto-generated code
51:  User.userRegisterPOST(body)
52:    .then(function (response) {
53:      utils.writeJson(res, response);
54:    })
55:    .catch(function (response) {
56:      utils.writeJson(res, response);
57:    });
58:};

我得到的错误是:

TypeError: Cannot read property 'value' of undefined
    at userRegisterPOST (/.../controllers/User.js:50:41)
    at swaggerRouter (/.../node_modules/oas3-tools/middleware/swagger-router.js:388:20)
    at Layer.handle [as handle_request] (/.../node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/.../node_modules/express/lib/router/index.js:317:13)
    at /.../node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/.../node_modules/express/lib/router/index.js:335:12)
    at next (/.../node_modules/express/lib/router/index.js:275:10)
    at /.../node_modules/oas3-tools/middleware/swagger-validator.js:388:30
    at /.../node_modules/async/dist/async.js:1140:9
    at /.../node_modules/async/dist/async.js:473:16
    at eachOfArrayLike (/.../node_modules/async/dist/async.js:1057:9)
    at eachOf (/.../node_modules/async/dist/async.js:1117:5)
    at _asyncMap (/.../node_modules/async/dist/async.js:1133:5)
    at Object.map (/.../node_modules/async/dist/async.js:1122:16)
    at swaggerValidator (/.../node_modules/oas3-tools/middleware/swagger-validator.js:358:15)
    at Layer.handle [as handle_request] (/.../node_modules/express/lib/router/layer.js:95:5)

我应该在 req.swagger.params['body'].value 中找到所有 GET 请求的参数。

最后,我解决了从 'oas3-tools' 切换到“oas-tools”(https://github.com/isa-group/oas-tools)以管理 OpenAPI 3.0 API 的问题。 使用这个新的 Node 模块,我能够在 req.body 中检索 POST 参数。

您可以继续使用 Swagger 的界面来创建您的 API,但不要从那里创建您的源代码。

将 "swagger.yaml" 文件保存到项目的文件夹中,例如 "C:\myproject",然后键入:

oas-generator swagger.yaml myproject

oas-generator 安装:

npm install oas-generator -g

重要:仔细阅读文档:https://github.com/isa-group/oas-tools

更强大的 OAS 2.x/3.x 生成器:https://github.com/OpenAPITools/openapi-generator