Angularjs(1.3.6+) $resource拦截器和全局 401 处理程序

Angularjs(1.3.6+) $resource interceptors and global 401 handlers

本文关键字:全局 程序 处理 resource Angularjs      更新时间:2023-09-26

我的问题是关于$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的纯文本Unathorized

但是我想得到response.status,如果401,就做点什么。

任何帮助将不胜感激。

这个问题应该结束了,因为我自己终于找到了答案。

当响应为 401/404 和 200 以外的任何内容时,transformResponse仍然执行并发生错误此错误仅涵盖正常响应(具有状态属性),因此我永远不会在拦截器中得到原始响应!

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

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