Javascript Angularjs(1.3.6+;)$资源拦截器和全局401处理程序

Javascript Angularjs(1.3.6+;)$资源拦截器和全局401处理程序,javascript,angularjs,http-status-code-401,angular-http-interceptors,Javascript,Angularjs,Http Status Code 401,Angular Http Interceptors,我的问题是关于$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 { responseErr

我的问题是关于
$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
,因为来自服务器的响应是纯文本
未加密的
,状态为
401

但是我想得到
响应.status
,如果是
401
,我想做点什么


任何帮助都将不胜感激。

这里有一个简单的拦截器,可以处理401,还可以进行一些配置:

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,则用户将重定向到登录页面。在这种情况下,承诺被拒绝,因此控制器或服务仍然会看到故障

这里有一个简单的拦截器,它可以处理401,还可以进行一些配置:

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,则用户将重定向到登录页面。在这种情况下,承诺被拒绝,因此控制器或服务仍然会看到故障

这个问题应该结束,因为我最终找到了答案


当响应为401/404以及200以外的任何值时,
transformResponse
仍在执行,并且发生了一个错误!这个错误只覆盖了正常响应(具有status属性),所以我从来没有在拦截器中得到原始响应


我认为如果响应的状态不是200,那么执行
transformResponse
是愚蠢的!在
transformResponse
中,您无法访问状态代码…

这个问题应该关闭,因为我终于找到了答案


当响应为401/404以及200以外的任何值时,
transformResponse
仍在执行,并且发生了一个错误!这个错误只覆盖了正常响应(具有status属性),所以我从来没有在拦截器中得到原始响应


我认为如果响应的状态不是200,那么执行
transformResponse
是愚蠢的!在
transformResponse
内部,您无法访问状态代码…

那么,
responseError.status
从哪里来?响应错误未定义。什么是AuthInfoService?我编辑了successHandler以使事情更清楚一些。responseError是承诺的成功处理程序中的参数。AuthInfoService是一种服务,用于帮助获取请求的授权标头。它还可以将用户重定向到loginpage。但是你不需要它。请再次检查我的问题。我的问题是
响应。状态
未定义!这就是您的
响应错误。状态
未定义。Angular1.3.6是否使用grunt build?检查正在加载的CDN。您还可以查看Angular V1.3.8或其他不应该存在问题的内容。查看此JonasHartmann代码:当响应为401/404且除200以外的任何值时,
transformResponse
仍在执行,并发生错误!这个错误只覆盖了正常响应(hasstatus属性),所以我从来没有在拦截器中得到原始响应!那么,
responseError.status
来自哪里?响应错误未定义。什么是AuthInfoService?我编辑了successHandler以使事情更清楚一些。responseError是承诺的成功处理程序中的参数。AuthInfoService是一种服务,用于帮助获取请求的授权标头。它还可以将用户重定向到loginpage。但是你不需要它。请再次检查我的问题。我的问题是
响应。状态
未定义!这就是您的
响应错误。状态
未定义。Angular1.3.6是否使用grunt build?检查正在加载的CDN。您还可以查看Angular V1.3.8或其他不应该存在问题的内容。查看此JonasHartmann代码:当响应为401/404且除200以外的任何值时,
transformResponse
仍在执行,并发生错误!这个错误只覆盖了正常响应(hasstatus属性),所以我从来没有在拦截器中得到原始响应!