【问题标题】:Dark magic going through res.json()通过 res.json() 的黑魔法
【发布时间】:2021-06-12 00:59:59
【问题描述】:

为了避免 XY 问题,这是我的最终目标:我想获取一些东西,使用响应正文,然后返回响应(用户应该能够从中获取正文)而不单独返回正文。在纸上,这应该可行:

const res = await fetch("something")
const clone = res.clone()
const body = await clone.json()
// Use body
return res

如果我幸运的话,这个过程会在await clone.json() 期间结束。如果我不这样做,它会冻结。永远。

提醒一下,res.json 不能被调用两次。

它是否认为我不够好,无法收到错误消息?有什么帮助吗?谢谢。

进展


我找到了错误:在node_modules/node-fetch/lib/index.js:416 中,操作结束时的监听器永远不会被触发。我还是不知道为什么。


将 URL 替换为 "https://jsonplaceholder.typicode.com/todos/1" 时,一切正常。这可能与服务器有关。我看不到请求的来源与是否可以克隆请求之间的任何联系...


res.text() 放在clone.json() 之前可以神奇地修复它,但它会让一切失去它的目的。


通过弄乱模块的代码,我发现响应实际上永远不会结束。 JSON 被剪切,来自最后一个 data 事件调用的块不是 JSON 的结尾,因此永远不会调用 end 事件。非常混乱。


我在这个问题上花了太多时间,我将通过单独返回正文来避免它。

【问题讨论】:

  • 如果你将 clone/json 逻辑放在一个 promise 中并避免使函数异步,会有什么改变吗?
  • 我还没试过,但为什么会改变呢?
  • 如果您认为有错误,但没有看到,请尝试将您的代码放在try-catch 块内,例如try { /* your code */ } catch (e) { console.warn(e) }
  • 是的,这是我的第一个猜测,我已经尝试过了......我会再次检查。
  • 听起来你所访问的端点在通过数据传输后没有正确关闭连接。它有时工作的原因可能是因为端点在关闭/超时时终止非活动连接,然后触发“结束”侦听器。

标签: javascript node.js fetch-api node-fetch


【解决方案1】:

这似乎工作得很好

const myFetch = async (url) => {
  const resp = await fetch(url),
        clone = resp.clone()
        json = await clone.json() 
  console.log('inner:', json.title)
  return resp
}

myFetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.json())
  .then(json => console.log('outer:', json.title))

【讨论】:

  • 是的,它确实有效,即使在我的机器上复制它时也是如此......还有其他问题,让我调查......
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2016-12-05
相关资源
最近更新 更多