从零实现axios(4.2小节-错误处理2)

424 阅读2分钟

错误处理2

我们对外提供isAxiosError辅助函数,帮助判断一个对象是否是AxiosErro实例,我们在helpers文件夹下创建isAxiosError.js文件,代码如下:

'use strict';

var utils = require('./../utils');

// 对象的isAxiosError属性为true,则是AxiosErro实例
module.exports = function isAxiosError(payload) {
  return utils.isObject(payload) && (payload.isAxiosError === true);
};

我们在根目录的axios.js中,对外提供这个辅助函数

axios.AxiosError = require('./core/AxiosError');
axios.isAxiosError = require('./helpers/isAxiosError');

我们继续完善之前的代码,在需要错误处理的地方把代码补全。首先是defaults/index.js中的transformResponse函数。代码如下:

var AxiosError = require('../core/AxiosError');
var defaults = {
  transformResponse: [function transformResponse(data) {
    // transitional用来指定对是否要对响应数据进行JSON.parse
    // 该对象既可以由用户配置对象指定,也可以使用默认值
    var transitional = this.transitional || defaults.transitional;
    // 对数据进行JSON.parse时,如果有异常,是否应该抛出,默认不抛出
    var silentJSONParsing = transitional && transitional.silentJSONParsing;
    // 强行对数据进行JSON.parse
    var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
    // 严格的JSON.parse,会抛出异常
    var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';


    if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
      try {
        return JSON.parse(data);
      } catch (e) {
        if (strictJSONParsing) {
          if (e.name === 'SyntaxError') {
            // 后端的响应数据不是JSON格式,抛出一个AxiosError
            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
          }
          // 其他错误直接抛出
          throw e;
        }
      }
    }

    return data;
  }],
};

然后是core/settle.js中的settle函数也需要进行错误处理,代码如下:

var AxiosError = require('./AxiosError');
module.exports = function settle(resolve, reject, response) {
  // 我们将在第二章讲解config的各种默认属性,我们到时候再实现validateStatus方法,
  // 这里暂不实现该方法,即暂时不对响应状态码进行校验
  var validateStatus = response.config.validateStatus;
  // 如果状态码存在,并且存在验证状态码方法,则直接用validateStatus方法验证状态码
  // 如果状态码存在,验证状态码的方法不存在,则直接resolve
  // 如果response.status = 0,表明file:协议请求成功,也直接resolve
  // 验证不通过,则reject
  if (!response.status || !validateStatus || validateStatus(response.status)) {
    resolve(response);
  } else {
    // 状态码验证不通过,则抛出一个请求失败的错误
    reject(new AxiosError(
      'Request failed with status code ' + response.status,
      // 400对应ERR_BAD_REQUEST,500对应ERR_BAD_RESPONSE
      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
      response.config,
      response.request,
      response
    ));
  }
};