我的问题是关于$resource
的拦截器(responseError)。我想强调的是,我所基于的angularjs是V1.3.6
。
问题:
app.factory('authInterceptor',['$q', '$location', '$log', function($q, $location, $log){
$log.debug('this is a regular factory with injection');
return {
responseError: function(response){
console.log(response)
// problem is that I cant check 401 by response.status,
// because the response here is AN ERROR OBJECT like `SyntaxError: ...`. Anyway to get the status?
return $q.reject(response);
}
}
}])
当我得到401响应时,responseError
的参数是SyntaxError: Unexpected token U
之类的错误对象,因为来自服务器的响应是纯文本Unathorized
,其状态为401
。
但是我希望得到response.status
,如果是401
则执行某些操作。
任何帮助将不胜感激。
答案 0 :(得分:3)
这个问题应该结束,因为我终于找到了答案。
当响应为401/404且除了200以外的任何内容时,transformResponse
仍然执行且发生错误!这个错误只是覆盖正常的响应(有状态属性),所以我永远不会在拦截器内获得原始响应!
如果响应的状态不是200,我认为执行transformResponse
是愚蠢的!在transformResponse
内,您无法访问状态代码...
答案 1 :(得分:0)
这是一个处理401s的简单拦截器,以及一些配置:
angular.module('notesApp', [])
.factory('AuthInterceptor',['AuthInfoService', '$q', function(AuthInfoService, $q) {
return {
responseError: function(responseError) {
if (responseError.status === 401) { // authentication issue
//redirect user to login or do something else...
}
return $q.reject(responseError);
}
};
}])
.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('AuthInterceptor');
}]);
**这是一个拦截器,只拦截带有非200状态代码的传入响应。** 如果状态代码为401,则将用户重定向到登录页面。在这种情况下,承诺被拒绝,以便控制器或服务仍然看到失败