如何创建一个http拦截器以在“响应”中返回错误&#39 ;?

时间:2016-02-16 06:09:28

标签: javascript angularjs

我有一个基本的角度http拦截器来处理我的所有错误。我需要检查返回的data是否都是string类型,以便将其作为错误处理,而不是成功。

'response': function(response) {
    if(typeof response.data === 'string') {
        response.status = 422;
        return $q.reject(response);
    } else {
        return response;
    }
},
'responseError': function(rejection) {
    return $q.reject(rejection);
}

目前,如果datastring的类型,它将输入正确的if语句,更改状态并返回。虽然,Angular并没有将此视为错误。在我的http函数中,它既不调用成功也不调用错误回调。如果API返回合法错误,则会进入' responseError'成功,并按预期调用错误回调。

$http({
  method: 'POST',
  url: "http://mydomain/api/login",
  data: $.param({
     username: "test",
     password: "test"
  }),
  headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(successCallback(response), errorCallback(response));

如何让我的拦截器返回Angular可以识别的错误,以便从我的http函数输入错误回调?

1 个答案:

答案 0 :(得分:0)

作为一种解决方案,您需要为下面的常见ajaz响应和responseError建立工厂,并将其注入系统的配置中,如下所示。

// Angular factory在单独的文件中并加载到索引中。

angular.module('yourApp').factory('myHttpInterceptor', function($q, $location) {
    return {
        // optional method
        'response': function(response) {
            // do something on success
            if(typeof response.data === 'string') {
                response.status = 422;
                return $q.reject(response);
            } else {
                return response;
            }
        },

        // optional method
       'responseError': function(rejection) {
          // do something on error
          return $q.reject(rejection);
        }
    };
});

现在拦截app.js中的配置

.config([ '$httpProvider', 
    function($httpProvider) {
       $httpProvider.interceptors.push('myHttpInterceptor');
} ])

这适合我。