fjc0k / taro-axios

在 Taro 中使用 axios。
https://www.npmjs.com/package/taro-axios
MIT License
139 stars 8 forks source link

PostData的构造函数名在prebundle中的发生变化,导致data转为string #34

Open bestsamsg opened 3 weeks ago

bestsamsg commented 3 weeks ago

以下代码判断PostData的方式错误,最终会走到utils.isObject(data)的代码块中,看微信prebundle代码中,实际上PostData的构造函数名已经变为PostData2

function transformRequest(data, headers) {
    normalizeHeaderName(headers, 'Accept');
    normalizeHeaderName(headers, 'Content-Type');
    if (utils.isFormData(data) ||
      utils.isArrayBuffer(data) ||
      utils.isBuffer(data) ||
      utils.isStream(data) ||
      utils.isFile(data) ||
      utils.isBlob(data) ||
      // 放行 PostData
      (data !== null && typeof data === 'object' && data.toString() === '[object PostData]')
    ) {
      return data;
    }
    if (utils.isArrayBufferView(data)) {
      return data.buffer;
    }
    if (utils.isURLSearchParams(data)) {
      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
      return data.toString();
    }
    if (utils.isObject(data)) {
      setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
      return JSON.stringify(data);
    }
    return data;
  }

以下为prebundle中的代码

var PostData = function() {
    function PostData2(postData) {//此行,构造函数名已经变成PostData2
        _classCallCheck(this, PostData2);
        this.postData = postData;
    }
    _createClass(PostData2, [
        {
            key: "getParsedPostData",
            value: function getParsedPostData() {
                var postData = this.postData;
                var parsedPostData = {
                    normalData: {},
                    fileData: {}
                };
                if (isObject$1(postData)) {
                    Object.keys(postData).forEach(function(key) {
                        if (postData[key] && postData[key] instanceof FileData) {
                            parsedPostData.fileData[key] = postData[key].getFileContent();
                        } else {
                            parsedPostData.normalData[key] = postData[key];
                        }
                    });
                }
                return parsedPostData;
            }
        },
        {
            key: "toString",
            value: function toString3() {
                return "[object ".concat(PostData2.name, "]");
            }
        }
    ]);
    return PostData2;
}();

建议使用instanceOf的方式判断类型

(data !== null && typeof data === 'object' && (data instanceof PostData))