从JavaScript的抓取中重读响应正文

时间:2016-11-08 22:57:52

标签: javascript json stream fetch httpresponse

fetch()返回promise(如果成功)解析为Response对象的promise。一个非常常见的事情是立即调用Response.json()将响应主体转换为JSON对象。

如果响应主体不是有效的JSON,则Response.json()承诺失败并显示错误。该消息的内容如下:

  

位于0的JSON中的意外标记X

在尝试诊断问题时,这不是很有帮助;理想情况下,我希望能够从服务器上看到内容(这通常是一条错误消息)。

但是,您似乎只能在Response.body一次(至少在Chrome中)阅读该流。 (甚至还有一个只读的Response.bodyUsed标志。)当Response.json()试图将身体转换为JSON时,已经发生这种情况,因此身体似乎永远丢失了JSON解析失败。

有没有办法恢复原始的响应体...当原始的fetch Promise结算时,没有手动读取它(然后转换为JSON)?

4 个答案:

答案 0 :(得分:22)

使用Response.clone()克隆Response

let clone = response.clone();

或者,使用Response.body.getReader()返回ReadableStream来读取Response作为流,TextDecoder()Uint8Array数据流转换为文本。

答案 1 :(得分:8)

我必须处理一个偶尔会破坏JSON响应的API - 在返回=DATE(MID(F16, 7, 4), LEFT(F16, 2), MID(F16,4, 2))+TIME(MID(F16, 14, FIND(":", F16)-14), MID(F16, FIND(":", F16)+1, 2), 0)+IF(RIGHT(F16, 2) = "AM", 0, 0.5) 之前我复制了一个响应对象。使用catch块,我可以确定错误是否是SyntaxError,然后使用响应克隆的文本结果继续修复错误

有点像这样:

response.json()

var brokenJson = function (url) { var responseCopy; return fetch(url) .then(function (response) { responseCopy = response.clone(); return response.json(); }).catch(function (err) { if (err instanceof SyntaxError) { return responseCopy.text() .then(function(data) { return fixJson(data); }); } else { throw err; } }).then(function (json) { // do things }); }; 只是一个修复收到的数据的函数 - 在我的情况下,当JSON破坏时,它总是以相同的方式被破坏 - 我认为它有一个额外的领先{或尾随} - 可以&# 39; t召回

重新阅读问题,您更有可能想要将错误记录到控制台而不是修复json - 轻松重写:

fixJson

答案 2 :(得分:0)

将response.json()分配给一个变量并返回它对我有用。 clone()再次说它已锁定。

fetch("http://localhost:3000/watchlist")
    .then(response => {
      var res = response.json();
      return res;
    })
    .then(data => {
      console.log(data);
      this.setState({ data });
    });

答案 3 :(得分:0)

我使用了 JSON.parse(response.resp.data) 因为不知何故克隆不起作用。

相关问题