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