【问题标题】:Handling errors on 200 HTTP response using interceptors使用拦截器处理 200 HTTP 响应的错误
【发布时间】:2016-03-03 22:47:22
【问题描述】:

我有与外部 API 集成的服务。此 API 不一致,不太可能更改。

API 内部有两种报错方法,一种是使用 HTTP 500 代码响应,另一种是正常的 200 HTTP 响应,但 JSON 中的status 设置为“错误”。

处理 500 错误工作正常,我刚刚使用 responseError 方法创建了拦截器(ngResource 拦截器,而不是 $http 拦截器),当 API 有任何 500 响应时将向用户显示错误消息:

.factory('ApiErrorHandling', ['ngDialog', function(ngDialog) {
    return {
        responseError: function(response) {
            console.log(response);
            var error_dialog = ngDialog.open({
                template: '/api/error.html',
                className: 'error',
                preCloseCallback: function() {
                    if (response.data.status == 'fatal') {
                        window.location.href = '/';
                    } else if (response.data.status == 'error') {
                        var dialogs = ngDialog.getOpenDialogs();
                        for (var i in dialogs) {
                            var dialog = dialogs[i];
                            if (dialog != error_dialog.id) {
                                ngDialog.close(dialog);
                            }
                        }
                    }
                },
                data: {
                    code: response.data.code,
                    status: response.data.status,
                    message: response.data.message,
                    httpCode: response.status,
                }
            });
        },
    }
}])
.factory('ApiMethod', ['$resource', 'ApiErrorHandling', function($resource, ApiErrorHandling) {
    return $resource('/api/method/', {}, {
            query: {method:'POST', interceptor: ApiErrorHandling},
    });
}])

但我在处理 status 的错误响应时遇到问题。我不希望在发生错误时调用正常的成功回调(从资源实例传递到方法),我想要一个全局错误处理程序,但到目前为止我没有尝试过任何工作。每次响应都传递给回调。到目前为止我已经尝试过:

  • 在response 方法中从拦截器返回 $q.reject
  • 更改状态码以响应来自拦截器的response 方法内的 500
  • 从拦截器更改或删除 response 方法中的 response.resource

理想的解决方案是不调用普通回调,而是调用来自拦截器的responseError 方法。

【问题讨论】:

    标签: angularjs ngresource


    【解决方案1】:

    但是我在处理带有状态的错误响应时遇到了问题。我不希望在发生错误时调用正常的成功回调(从资源实例传递到方法),我想要一个全局错误处理程序,但到目前为止我没有尝试过任何工作。每次响应都传递给回调。到目前为止我已经尝试过:

    在拦截器的响应方法中返回 $q.reject

    要拒绝您不喜欢的回复,请使用throw:

    function inteceptor(httpPromise) {
        var newPromise = (httpPromise
            .then(function(response) {
                      if (dontLike) {
                          throw response;
                      } else {
                          return response;
                  },
                  function (eResponse) {
                      if (iLike) {
                          return eResponse;
                      } else {
                          throw eResponse;
                      };
                  })
         );
         return newPromise;
    };
    

    从你的拦截器链接

    var chainedPromise = (interceptor(httpPromise)
        .then (function (response) {
             //render data
             return response;
        }).catch (function (error) {
             console.log(error);
             throw error;
        })
    );
    

    【讨论】:

      【解决方案2】:

      我找到了解决方案。我认为是 ngResource 模块中的一些错误。

      当像这样注册回调时:

      ApiMethod.query({'get_parameter': 1}, {'post_json': 2}, function(result) {
          something...
      });
      

      防止调用回调的唯一解决方案是从 ngResource 拦截器抛出错误。但是当回调在 promise 中注册时:

      ApiMethod.query({'get_parameter': 1}, {'post_json': 2}).$promise.then(function(result) {
          something...
      });
      

      可以通过从拦截器返回$q.reject来阻止回调。

      重写所有回调注册可以解决问题。

      【讨论】:

        猜你喜欢
        • 2016-09-20
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 2022-08-16
        • 2017-09-20
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多