【发布时间】: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