如何解决通过 res.json() 的黑魔法 进展
为了避免 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
中,永远不会触发动作结束时的侦听器。我还是不知道为什么。
当用 "https://jsonplaceholder.typicode.com/todos/1"
替换 URL 时,一切正常。这可能与服务器有关。我没有看到请求的来源与是否可以克隆请求之间的任何联系...
将 res.text()
放在 clone.json()
之前可以神奇地修复它,但它会使一切失去目的。
通过弄乱模块的代码,我发现响应实际上永远不会结束。 JSON 被切断,最后一个 data
事件调用的块不是 JSON 的结尾,所以 end
事件永远不会被调用。非常混乱。
我在这个问题上花了太多时间,我将通过单独返回正文来避免它。
解决方法
这似乎工作得很好
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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。