Параметры POST не получены Swagger3.0 / OpenAPI - PullRequest
1 голос
/ 08 июня 2019

Я пишу веб-сайт, используя Swagger 3.0 / OpenAPI для описания моих API и Node.js для серверной части.Я успешно заставил GET-запросы работать, но у меня возникли некоторые проблемы со всеми POST-запросами.Проблема заключается в том, что параметры, которые я предоставляю из формы HTML при выполнении запроса POST, не принимаются автоматически генерируемыми обработчиками Swagger в папке / controllers.В частности, массив req.swagger.params и req.swagger.params ['body'], подполя объекта HTTP-запроса, который должен содержать параметры, всегда пусты.

Iпопытался использовать и «application / x-www-form-urlencoded», и «application / json» в качестве ContentType;Я пытался выполнить запрос из разных источников, таких как SwaggerUI, Postman, интерфейсная веб-страница и CURL;Я пробовал и FetchAPI, и JQuery AJAX ($ .post и $ .ajax).

Вот как я выполняю запрос POST в Register.js:

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

Вот как яопишите мой API в swagger.yaml:

(...)
/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 для запросов POST в / user / register:

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.

1 Ответ

0 голосов
/ 29 июня 2019

Наконец, я решил переключиться с «oas3-tools» на «oas-tools» (https://github.com/isa-group/oas-tools) для управления API-интерфейсами OpenAPI 3.0. С этим новым модулем Node я могу получать параметры POST в req.body.

...