Swagger Nodejs - Ошибка проверки ответа

Я создаю API с помощью Swagger и NodeJS, досадная проблема, с которой я столкнулся до сих пор, заключается в том, что Swagger проверяет ответ, и это не всегда гладко.

Мое дело:

В файле .yaml: я проверил синтаксис yaml с помощью Swagger Editor => File Yaml верен.

/user/createNew:
x-swagger-router-controller: xxxxxxx
post:
  tags:
  - User
  summary: Create New User
  # used as the method name of the controller
  operationId: createNewUser
  parameters:
    - name: NewUserReq
      in: body
      required: true
      description: Email register
      schema:
        $ref: "#/definitions/NewUserReq"

  responses:
    "201":
      description: Successful
      schema:
        # a pointer to a definition
        $ref: "#/definitions/CreateUserResp"
    # responses may fall through to errors
    default:
      description: Error
      schema:
        $ref: "#/definitions/ErrorResponse"


CreateUserResp:
properties:
  status:
    type: integer
    description: Response status
  response:
    $ref: "#/definitions/MsgResponse"
MsgResponse:
  required:
    - resp_msg
  properties:
    resp_msg:
     type: string

Чтобы проверить формат ответа, я сгенерировал файл NodeJs из редактора Swagger.

 examples['application/json'] = {
    "response" : {
        "resp_msg" : "aeiou"
     },
    "status" : 123
 };

В файле контроллера .js:

function createNewUser(req,res){
....

var resp = new Object();
resp.resp_msg=data.email;
final_response.status = 200;
final_response.response = resp;

console.log("createNewUser::Query succeffully", JSON.stringify(final_response)); 
//{"status":200,"response":{"resp_msg":"[email protected]"}}

res.set('Content-Type', 'application/json');
res.json(final_response);
}

Попробуйте запустить API с Postman, ошибка происходит с журналом ниже:

Error: Response validation failed: failed schema validation
at throwErrorWithCode (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/lib/validators.js:121:13)
at Object.module.exports.validateAgainstSchema (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/lib/validators.js:176:7)
at /var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:141:22
at /var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:356:13
at async.forEachOf.async.eachOf (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:233:13)
at _asyncMap (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:355:9)
at Object.map (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:337:20)
at validateValue (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:134:11)
at ServerResponse.res.end (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:252:9)
at ServerResponse.send (/var/app/current/node_modules/express/lib/response.js:205:10)

Я не могу понять, что вызвало ошибку, я дважды проверил структуру ответа JSON.

Очень признателен за любое предложение.


person franco phong    schedule 11.02.2017    source источник


Ответы (3)


Вы установили required: true, что означает, что вы должны передать этот параметр, иначе появится сообщение Ошибка проверки ответа.

person Dharmendra Agrawal    schedule 10.12.2018

Я пытался воспроизвести, но это дает мне некоторые ошибки. Однако я попытался удалить MsgResponse и определить CreateUserResp как одно определение, и это сработало:

CreateUserResp:
  type: object
  properties:
    response:
      type: object
      properties:
        resp_msg:
          type: string
          description: The response object
    status:
      type: number
      description: The status code

Похоже, вы не определяете response как объект, а просто добавляете к нему некоторые свойства.

person Luis Diego Hernández    schedule 11.02.2017
comment
Спасибо, Луис, за быстрый ответ. К сожалению, я все еще получил ошибку с вашим ответом. - person franco phong; 12.02.2017
comment
Вы смогли это исправить? - person Luis Diego Hernández; 14.02.2017

После нескольких экспериментов у меня получилось. Мое решение просто меняет код ответа «201» на «200» в файле yaml, и это сработало. Я не знаю, почему я оставил код ответа «201». Во всяком случае, я все еще новичок в этом, и не знаю, является ли это лучшей практикой или нет. Я открыт для получения любого лучшего предложения.

person franco phong    schedule 13.02.2017
comment
Большое спасибо, это исправило это для меня! - person AliF50; 05.09.2017