Javascript 穿越res.json()的黑魔法
为了避免XY问题,我的最终目标是:获取一些东西,使用响应主体,并返回响应(用户应该能够从中获取主体),而不单独返回主体。从理论上讲,这应该是可行的:Javascript 穿越res.json()的黑魔法,javascript,node.js,fetch-api,node-fetch,Javascript,Node.js,Fetch Api,Node Fetch,为了避免XY问题,我的最终目标是:获取一些东西,使用响应主体,并返回响应(用户应该能够从中获取主体),而不单独返回主体。从理论上讲,这应该是可行的: const res=wait fetch(“某物”) const clone=res.clone() const body=await clone.json() //使用主体 返回res 如果幸运的话,这个过程将在等待clone.json()期间结束。如果我不这样做,它就会冻结。永远 作为提醒,res.json不能被调用两次 它是否认为我不够好,
const res=wait fetch(“某物”)
const clone=res.clone()
const body=await clone.json()
//使用主体
返回res
如果幸运的话,这个过程将在等待clone.json()
期间结束。如果我不这样做,它就会冻结。永远
作为提醒,res.json
不能被调用两次
它是否认为我不够好,无法收到错误消息?有什么帮助吗?多谢各位
进展
我找到了错误:在
node\u modules/node fetch/lib/index.js:416
中,操作结束时的侦听器从未触发。我还是不知道为什么
将URL替换为
时https://jsonplaceholder.typicode.com/todos/1“
,一切正常。这可能与服务器有关。我看不到请求的来源与是否可以克隆请求之间有任何联系
将
res.text()
放在clone.json()
之前可以神奇地修复它,但这会使一切失去其目的
通过修改模块的代码,我发现响应实际上永远不会结束。JSON被剪切,最后一次
数据
事件调用中的块不是JSON的结尾,因此永远不会调用结束
事件。非常混乱
我在这个问题上花了太多的时间,我将通过单独返回尸体来避免它。这似乎很好
constmyfetch=async(url)=>{
const resp=等待获取(url),
clone=resp.clone()
json=wait clone.json()
log('inner:',json.title)
返回响应
}
myFetch('https://jsonplaceholder.typicode.com/todos/1')
.then(resp=>resp.json())
.then(json=>console.log('outer:',json.title))
如果将克隆/json逻辑放入承诺中并避免使函数异步,会有什么变化吗?我还没有尝试过,但为什么会有什么变化呢?如果您认为有错误,但没有看到,请尝试将代码放在try catch
块中,如try>{/*您的代码*/}catch(e){console.warn(e)}
是的,这是我的第一个猜测,我已经尝试过了……我会再检查一次。听起来,您正在访问的端点在通过数据管道传输后没有正确关闭连接。它有时工作的原因可能是因为端点在关闭/超时时终止非活动连接,然后触发“结束”列表r、 是的,它确实有效,即使在我的机器上复制它…还有其他问题,让我调查一下。。。