Ожидаемый тип объекта, но найденная строка типа - PullRequest
0 голосов
/ 17 апреля 2020

У меня проблемы с настройкой API. Я получаю следующую ошибку:

[
  {
    "message": "Wrong data in the response. ",
    "error": [
      {
        "code": "INVALID_TYPE",
        "params": [
          "object",
          "string"
        ],
        "message": "Expected type object but found type string",
        "path": "#/"
      }
    ],
    "content": "{\"success\":true,\"payload\":{\"userId\":47}}"
  }
]

С заголовками ответа:

connection: keep-alive  
content-length: 233  
content-type: application/json; charset=utf-8  
date: Fri, 17 Apr 2020 08:09:38 GMT  
etag: W/"e9-2OFjPp0RZp8asoi4T2vo8yXiZxE"  
x-powered-by: Express 

Теперь я ожидал, что это сработает, так как этот же код работает при использовании Swagger 2.0 вместо oas-tools 3.0.1. Это мой файл чванства:

openapi: 3.0.1
info:
  title: Swagger test
  version: 0.0.1
servers:
- url: http://localhost:8081/
paths:
  /add-user:
    post:
      x-router-controller: 'addUser'
      description: Adds a user to the database
      operationId: add
      requestBody:
        $ref: '#/components/requestBodies/AddUser'
      responses:
        201:
          description: Successfully added the user to the database
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  payload:
                    type: object
                    properties:
                      userId:
                        type: integer

И это мой сценарий узла, в котором я отправляю ответ обратно:

db
.query(insert_user_query, [username, password])
.then(function(result) {
    var response = {
        "success": true,
        "payload": {
            "userId": result.rows[0].user_id
        }
    }

    res.status(201).json(response)
})

Теперь я полностью растерялся, так как строю JSON в переменной ответа, и я устанавливаю код ответа 201 и отправляю его как json (который добавляет приложение / json тип содержимого), и все же Swagger интерпретирует его как строку вместо объекта.

Кто-нибудь здесь, кто мог бы, пожалуйста, указать мне в правильном направлении?

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

У меня была такая же проблема, и я использовал Express 4.x.

Я могу ошибаться, но я думаю, что может быть проблема с "res. json" (то есть res.status (xxx). json ({a: b});)

Я обошел проблему, используя send:

res.status(201).send(response); // in your case
0 голосов
/ 17 апреля 2020

Вы должны взять строку и разобрать ее обратно в объект.

res.json() берет ваш объект и преобразует его в строку, используя формат json. application/json - это строковый формат, и вы отправляете отформатированные объекты javascript по сети. Они преобразуются в канонический формат строки, отправляются по сети, а затем для использования их в качестве объектов, их необходимо проанализировать и преобразовать обратно в реальные живые объекты.

Вы не показываете принимающий код, но что-то на принимающей стороне должно вызвать JSON.parse() в ответе на строку. Это вернет вам фактический объект, который вы можете использовать, поскольку он преобразует строку json обратно в объект на принимающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...