为什么响应与发布请求不同?

时间:2021-07-29 04:27:37

标签: javascript json express axios next.js

问题: console.log(res.data) 给出的结果与 console.log(JSON.parse(res.request.response)) 不同。

我正在从我的 Next.js 应用程序向内部 API 发出发布请求。它是对返回列表对象的 REST 端点的请求。数据应如下所示:

[
  {
    "views": [ { "data1": 1 ...}, ...],
    "otherViews": [ {"data2": 1, ...}, ...],
  },
  ...
]

我正在以典型的 then/catch 格式访问此请求中的数据。所以

let internalServerResponse = axios.post(endpoint, body, config)
    return internalServerResponse
    .then(res => {
        let errors = null;
        let data = null;
        if (res.data.errors) {
            errors = res.data.errors;
        } else {
            data = res.data
        }
        return {
            errors: errors,
            data: data
        }
    } )
    .catch(err => {
        return {
            errors: err,
            data: null
        }
    })

问题出现在 views 列表总是返回一个空列表,而 otherViews 列表似乎不受影响。

{
    "identifier": "...",
    "views": [],
    "otherViews": [
        {
            "field1": "...",
            "field2": "...",
            "field3": "..."
        },
        ...
    ]
}

查看来自服务器的 res.request.response,我看到 views 列表实际上不是空的(如预期的那样),并且视图列表中对象的格式类似于otherViews 列表。返回的响应 (res.request.response) 是有效的 JSON。

JSON.parse(res.request.response) 的控制台日志输出:

{
    "identifier": "...",
    "views": [
        {
            "field1": "...",
            "field2": "...",
            "field3": "..."
        },
        ...
    ],
    "otherViews": [
        {
            "field1": "...",
            "field2": "...",
            "field3": "..."
        },
        ...
    ]
}

我的尝试

为了调试,我试过:

  • 打印 res.data 以提供缺失的视图列表
  • 打印给出正确对象的 JSON.parse(res.request.response)
  • 设置我的data = JSON.parse(res.request.response),它仍然以某种方式给出了缺失的视图列表

我完全被难住了。我有两个问题:

  • 为什么 res.data 和 JSON.parse(res.request.response) 不同?
  • 当我将值分配给变量时,该值到底是如何变化的?

1 个答案:

答案 0 :(得分:0)

答案:

问题已解决。由于我传递结果对象的方式,我过滤了原始 views 对象中引用的 res.data 列表。

请参阅此参考:Does JavaScript pass by reference?