预期的类型对象,但找到了类型字符串

时间:2020-04-17 08:16:42

标签: node.js swagger

我在设置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发送(添加了application / json内容类型),而Swagger解释为字符串而不是对象。

这里有人可以向我指出正确的方向吗?

2 个答案:

答案 0 :(得分:0)

您必须将字符串取回并将其解析回一个对象。

res.json()接收您的对象,并使用json格式将其转换为字符串。 application/json是一种字符串格式,这就是您通过网络发送javascript格式的对象的方式。它们被转换为规范的字符串格式,并通过网络发送,然后将它们用作对象,必须对其进行解析并将其转换回真实的实时对象。

您没有显示接收代码,但是接收方的某些内容需要在字符串响应上调用JSON.parse()。这将返回给您一个可以使用的实际对象,因为它将json字符串转换回接收方的对象。

答案 1 :(得分:0)

我遇到了同样的问题,并且正在使用Express 4.x。

我可能会弄错,但我认为“ res.json”可能存在问题(即res.status(xxx).json({a:b});)

我通过使用send解决了这个问题:

res.status(201).send(response); // in your case