// don't allow cloning a used body
if (instance.bodyUsed) {
throw new Error('cannot clone body after it is used');
// check that body is a stream and not form-data object
// note: we can't clone the form-data object without having it as a dependency
if (bodyStream(body) && typeof body.getBoundary !== 'function') {
// tee instance body
p1 = new PassThrough();
p2 = new PassThrough();
body.pipe(p1);
body.pipe(p2);
// set instance body to teed body and return the other teed body
instance.body = p1;
body = p2;
return body;
发现原因是代码使用了其中一个即 res.clone 的返回进行 .json 操作,相当于 p2.json()。但对另一个 res 即 p1 没有做处理。
而 stream 有一个 back pressure 机制,因为 p1 没有消耗,缓存数据满时会使其源 pause,从而导致 p2 也不能结束。
从上面跟踪发现应该是node-featch老版本的一个bug,发现node-fetch的最新版本已经修复了这个问题,但是umi-request引用了isomorphic-fetch库,这个库已经几年没更新,希望umi-request后续版本可以解决此问题!