添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement . We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

request.interceptors.response.use(async response => {
const result = await response..json();
return Promise.resolve({
...result,
data: decrypt(result.data, secret)
代码如上,因为需要做ssr同构,node端直接采用了umi-request,使用过程中发现如果response中内容比较大的情况下,response..json()返回的promise对象处于pending状态,查看了源码发现使用了isomorphic-fetch库,而isomorphic-fetch库采用的是"node-fetch": "^1.0.1"版本的代码,在node-fetch1.x版本中的clone()方法代码如下:
Body.prototype._clone = function(instance) {
var p1, p2;
var body = instance.body;

// 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后续版本可以解决此问题!