【问题标题】:Fetch retrieves a serialized object from the server. Why is it already deserialized when examined inside the fetch?Fetch 从服务器检索序列化对象。为什么在 fetch 内部检查时它已经反序列化了?
【发布时间】:2019-04-28 17:03:17
【问题描述】:

使用 fetch api,node.js 服务器发回以下序列化对象:

app.get('/getJoe', function(request, response) {

      var myObj = {};
      myObj.firstname = "Joe";
      myObj.age = 23;
      var myObjSerialized = JSON.stringify(myObj);
      response.send(myObjSerialized); //sends {"firstname":"Joe","age":23}

});

fetch API 处理响应如下:

function getJoe(){

    fetch('/getJoe')
    .then((response) => {
      return response.json();
    })
    .then((person) => {
      console.log(typeof(person)); //outputs object
      console.log(person) //outputs {firstname: "Joe", age: 23}
    })
}

为什么 fetch 渲染字符串化对象的方式与它在服务器上的渲染方式不同?

换句话说,如果服务器使用以下字符串化对象响应获取请求:

{"firstname":"Joe","age":23}

fetch 不应该仍将其视为字符串化吗?为什么将其呈现为:

{名字:“乔”,年龄:23​​}

此外,不必将 person 转换回对象(使用 JSON.parse(person) ),person 已经可以被视为对象。

【问题讨论】:

    标签: node.js express fetch-api


    【解决方案1】:

    return response.json();
    

    line 接收Response 流并返回解析为反序列化 版本的响应的Promise。如果您只想要纯文本,则可以改用 .text() 方法:

    return response.text();
    

    这种自动反序列化特定于 fetchfetch.json() 方法。如果您要使用XMLHttpRequest,您只有一个文本响应,您必须使用JSON.parse 将其转换回一个对象。

    【讨论】:

    • 我发现有趣的是反序列化可以发生在任何有效的 JSON (根据 MDN)上,你能确认一下吗?
    • 当然,我想它会调用JSON.parse,它确实可以解析任何有效的JSON
    • 我也想到了这一点,并通过JSON.parse('[{"a":8}]')JSON.parse('8.8') 确认。奇怪的是,我从来不知道 JSON 可以是根级别的对象以外的任何东西:\(尽管在其主页上明确说明)
    • 感谢您的回复。它澄清了这一点。重新访问developer.mozilla.org/en-US/docs/Web/API/Body/json 的文档似乎证实了您所说的; json() 方法调用 JSON.parse。不过,我认为这可以在文档中更明确地说明。无论如何,对我来说,这不是预期的行为。
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多