最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • axios-post对data的默认处理

    正文概述 掘金(Tadm)   2021-02-03   849

    起因

    • 表单提交的数据
    api.post(`xxx`, {
    	brandGoodId: undefined
    	categoryName: "test41"
    	coverImgUrl: "hello"
    	description: undefined
    })
    

    结果

    经测试发现虽然我提交了上面那样的对象,但最终在network中看到的数据如下:

    {
    	categoryId: 5503
    	categoryName: "test41"
    	imgUrl: "hello"
    }
    

    很明显为undefined的属性在提交上去的数据中并没有出现对应字段(符合后端预期或者逻辑)

    解决

    • 首先查看项目中现有的axios的封装,是否已经存在对他们的处理(经查验只是一些常见的配置并未对提交的数据进行处理)
    • 那么就很有可能是axios本身对其做了一层处理,排查过程如下:

    Axios.js

    utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
      /*eslint func-names:0*/
      console.log(data)	// 这里的 data 仍为一开始的数据
      Axios.prototype[method] = function(url, data, config) {
        return this.request(utils.merge(config || {}, {
          method: method,
          url: url,
          data: data
        }));
      };
    });
    
    
    Axios.prototype.request = function request(config) {
      /*eslint no-param-reassign:0*/
      // Allow for axios('example/url'[, config]) a la fetch API
      if (typeof config === 'string') {
        config = utils.merge({
          url: arguments[0]
        }, arguments[1]);
      }
    
      config = utils.merge(defaults, {method: 'get'}, this.defaults, config);
      config.method = config.method.toLowerCase();
    
      // Hook up interceptors middleware
      // 重点:可以看到这里有 chain 数组,进入 dispatchRequest 函数
      var chain = [dispatchRequest, undefined];
      var promise = Promise.resolve(config);
    
      this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
        chain.unshift(interceptor.fulfilled, interceptor.rejected);
      });
    
      this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
        chain.push(interceptor.fulfilled, interceptor.rejected);
      });
    
      while (chain.length) {
        promise = promise.then(chain.shift(), chain.shift());
      }
    
      return promise;
    };
    

    dispatchRequest.js

    // Transform request data
    config.data = transformData(
    	config.data,
    	config.headers,
    	config.transformRequest
    );
    

    transformData.js

    module.exports = function transformData(data, headers, fns) {
      /*eslint no-param-reassign:0*/
      console.log(String(fns[0]))
      utils.forEach(fns, function transform(fn) {
        data = fn(data, headers);
      });
    
      return data;
    };
    

    打印的内容

    function transformRequest(data, headers) {
        normalizeHeaderName(headers, 'Content-Type');
        if (utils.isFormData(data) ||
          utils.isArrayBuffer(data) ||
          utils.isBuffer(data) ||
          utils.isStream(data) ||
          utils.isFile(data) ||
          utils.isBlob(data)
        ) {
          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();
        }
        // 重点:走到了这里,发现原来是做了一层序列化处理,正是因为 JSON.stringify(obj) 会把 undefined 的属性过滤掉
        if (utils.isObject(data)) {
          setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
          return JSON.stringify(data);
        }
        return data;
    }
    

    验证一下: dispatchRequest.js

    // Transform request data
    config.data = transformData(
    	config.data,
    	config.headers,
    	config.transformRequest
    );
    console.log(config.data);
    // result: right
    {
    	"categoryId":5503,
    	"categoryName":"test41",
    	"imgUrl":"hello"
    }
    

    结论


    起源地下载网 » axios-post对data的默认处理

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元