Я пишу веб-сайт, используя 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.