2015-11-30 97 views
1

我有與外部API集成的服務。這個API不一致,不太可能改變。使用攔截器處理200個HTTP響應時的錯誤

內部API有2種報告錯誤的方法,一種是HTTP 500代碼響應,另一種是正常的200 HTTP響應,但是在JSON中設置爲status設置爲「error」。

處理500錯誤工作正常,我剛創建的攔截器(ngResource攔截,而不是$ HTTP的一個)與responseError方法,將顯示錯誤消息以用戶當有來自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響應不斷變化的狀態碼500內response方法從攔截
  • response方法更改或刪除response.resource從攔截器

理想的解決方案將是當正常的回調不會被調用,但我的responseError方法從攔截器將被調用。

回答

2

但我有處理與狀態錯誤響應的問題。我不希望正常的成功回調(從資源實例傳入方法)在錯誤發生時被調用,我想要一個全局錯誤處理程序,但是我迄今爲止都沒有嘗試過。每次響應都被傳入回調。到目前爲止,我已經試過:

從攔截

響應方法返回$ 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; 
    }) 
); 
+0

如何捕獲拋出的錯誤? – GwynBleidD

1

我找到了解決方案。我認爲是ngResource模塊中的一些錯誤。

註冊時回調是這樣的:

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

唯一解決辦法防止調用回調從ngResource攔截拋出錯誤。但是,當回調註冊承諾:可通過攔截返回$q.reject只是防止

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

調用回調函數。

重寫所有回調註冊可修復問題。