在 angular 中使用 airbrake 报告 $http 错误

report $http error using airbrake in angular

我已经配置了 airbrake 来报告错误,但它似乎没有报告 http 错误。因此,我试图将其配置为这样做。这是我的工厂:

import AirbrakeClient from 'airbrake-js';

export let errorHttpInterceptor = ($q, CONSTANT) => {
  'use strict';

  let airbrake = new AirbrakeClient({
    projectId: CONSTANTS.AIRBRAKE_PROJECT_ID,,
    projectKey: CONSTANTS.AIRBRAKE_PROJECT_KEY
  });

  airbrake.addFilter((notice) => {
    console.log(notice);
    return notice;
  });

  return {
    requestError: (rejection) => {
      console.log(rejection);
      // do something on error
      airbrake.notify(rejection);
      return $q.reject(rejection);
    },

   responseError: (rejection) => {
     console.log(rejection);
     airbrake.notify(rejection);
     return $q.reject(rejection);
   }
  };
};

然后在配置中:

let httpAuthConfig = /*@ngInject*/ $httpProvider => {
  'use strict';

  let errorHttp = $injector => { return $injector.get('errorHttpInterceptor'); };

  $httpProvider.interceptors.push(['$injector', errorHttp]);
};

似乎只有我得到 [object Object] 作为减速板错误,没有额外的错误细节或回溯。还有什么我想念的吗?

这里是 Airbrake 的摩根! 由于您使用的是 angular,您是否尝试过添加 $exceptionHandler? airbrake-js 自述文件在 angular 部分有一个示例:

https://github.com/airbrake/airbrake-js#angular

mod.factory('$exceptionHandler', function ($log, config) {
  airbrake = new airbrakeJs.Client({
    projectId: config.airbrake.projectId,
    projectKey: config.airbrake.key
  });
  airbrake.addFilter(function (notice) {
    notice.context.environment = config.envName;
    return notice;
  });

  return function (exception, cause) {
    $log.error(exception);
    airbrake.notify({error: exception, params: {angular_cause: cause}});
  };
});

如果您在 angular 工作方面需要任何进一步的帮助,请随时发送电子邮件至 support@airbrake.io 或向我们发送应用内消息!

来自, 摩根

我终于发现服务器响应不是 airbrake 想要的格式,所以我将根据响应构建的错误消息传递给 airbrake 通知程序。

responseError: (response) => {
  console.log(response);
  airbrake.notify({
    error: {
      message: response.status + ': ' + response.data.error.general,
      name: 'HttpError: ',
      stack: ''
    }
  });
  return $q.reject(response);
}

感觉这不是最干净的解决方案,但确实有效。