Javascript 在AngularJS中,如何对“$http”的所有响应应用检查函数?

Javascript 在AngularJS中,如何对“$http”的所有响应应用检查函数?,javascript,angularjs,Javascript,Angularjs,我使用$http获取服务器数据,如果身份验证失败,服务器将响应一个空字符串。我想做的是,如果数据是空的,那么应用程序应该重定向到登录页面。但是因为有很多控制器,每个控制器都有几个$http调用,所以我不想到处复制和粘贴定向代码 是否有任何方法可以在每个$http响应上注入此函数,而无需到处编写相同的代码 我是否只能在某些特定控制器中的$http调用上应用它?您可以使用。intercetor的response方法在$http从后端接收到响应后立即调用。您可以修改响应或执行其他操作。该方法使用htt

我使用$http获取服务器数据,如果身份验证失败,服务器将响应一个空字符串。我想做的是,如果数据是空的,那么应用程序应该重定向到登录页面。但是因为有很多控制器,每个控制器都有几个$http调用,所以我不想到处复制和粘贴定向代码

是否有任何方法可以在每个$http响应上注入此函数,而无需到处编写相同的代码

我是否只能在某些特定控制器中的$http调用上应用它?

您可以使用。intercetor的response方法在$http从后端接收到响应后立即调用。您可以修改响应或执行其他操作。该方法使用http响应对象调用,需要直接返回响应对象,或者作为包含响应或新响应对象的承诺返回

$http({
    method: 'POST',
    url: '/getAllUsers'
}).success(function(data, status, headers, config) {
    if (data.length === 0) {
        $location.path('/admin/login');
    }
    // process data
    if (data.ok == 1) {
        // correct data
    } else {
        // error
    }
})
编辑: 我不确定这是否是$http配置的正确用法,我从来没有这样做过。。但您也可以有条件地向单个$http调用添加transformResponse函数:

你可以用一个。intercetor的response方法在$http从后端接收到响应后立即调用。您可以修改响应或执行其他操作。该方法使用http响应对象调用,需要直接返回响应对象,或者作为包含响应或新响应对象的承诺返回

$http({
    method: 'POST',
    url: '/getAllUsers'
}).success(function(data, status, headers, config) {
    if (data.length === 0) {
        $location.path('/admin/login');
    }
    // process data
    if (data.ok == 1) {
        // correct data
    } else {
        // error
    }
})
编辑: 我不确定这是否是$http配置的正确用法,我从来没有这样做过。。但您也可以有条件地向单个$http调用添加transformResponse函数:


您可以在模块配置中为$http编写一个简单配置,并在$http配置的transformResponse属性中编写错误处理。 大概是这样的:

function transformErrorResponse(data, headersGetter, status) {
  if (/* failed */)
    // handle failure
}

$http({ transformResponse : transformErrorResponse})
  .get(/*  */)
  .then(/*  */);

您可以在模块配置中为$http编写一个简单配置,并在$http配置的transformResponse属性中编写错误处理。 大概是这样的:

function transformErrorResponse(data, headersGetter, status) {
  if (/* failed */)
    // handle failure
}

$http({ transformResponse : transformErrorResponse})
  .get(/*  */)
  .then(/*  */);
您可以创建工厂定义,并在配置阶段使用$httpprovider将其作为拦截器推送

工厂定义

配置阶段

您可以创建工厂定义,并在配置阶段使用$httpprovider将其作为拦截器推送

工厂定义

配置阶段


顺便说一句,我实际上希望在某些特定控制器中使用$http来执行此检查,而其他控制器则不需要。我可以知道$http在哪个控制器中吗?@Melkor您可以尝试在$http调用上设置transformResponse请参见编辑。我突然想到,我可以检查该工厂中的控制器,因为我实际上将控制器分配给了不同的路由。顺便说一句,我实际上希望某些特定控制器中的$http执行此检查,而其他人则不然。我可以知道$http在哪个控制器中吗?@Melkor您可以尝试在$http调用上设置transformResponse请参见编辑。我突然想到,我可以在该工厂中检查控制器,因为我实际上将控制器分配给了不同的路由。这是全局的,不是吗?我可以在一些特定的控制器中排除一些$http调用吗?这是全局的,不是吗?我可以在一些特定的控制器中排除一些$http调用吗?但AngularJS说ngRoute模块无法加载。我试图在响应函数中记录一些内容,但什么也没有出现。啊,对不起,我插入了一个以ng开头的错误模块。问题解决了。但AngularJS说ngRoute模块无法加载。我试图在响应函数中记录一些内容,但什么也没有出现。啊,对不起,我插入了一个以ng开头的错误模块。问题解决了。
angular.module('myApp').factory('httpInterceptor', ['$location', function($location) {
    var httpInterceptor = {
        response: function(config){ 
            if (config.data.trim() == "") {
                $location.path('\login');
            }

            return config;
        }
    };
    return httpInterceptor;
}]);
angular.module('myApp').config(['$httpProvider' ,function($httpProvider) {
   $httpProvider.interceptors.push('httpInterceptor');
}]);