$ httpprovider导致“无法读取未定义的属性'标题'错误

时间:2016-04-04 14:34:29

标签: angularjs

我有一个带有节点/快速后端的角度应用程序。我试图使用httpProvider实现身份验证拦截器。当存在本地存储中的令牌时,应用程序按预期工作,并且我能够从后端检索受限数据,但是一旦我通过注销并尝试重定向到主视图来删除令牌,我就会得到一个TypeError :无法读取未定义的属性“标题”。如果我注释掉配置中的代码行,我已经注册了拦截器,错误就消失了。由于某些原因我无法诊断,除非本地存储中有令牌,否则应用程序会崩溃。

enter image description here

身份验证拦截器:

angular.module('barmehealth')
  .factory('authInterceptor', function(authToken) {

    return {
      request: function(config) {
        var token = authToken.getToken();

        if (token)  {
          config.headers.Authorization = 'Bearer ' + token;

          return config;
        }
      },
      response: function(response) {
       return response;
      }
    };
  });

在Config对象中注册:

$httpProvider.interceptors.push('authInterceptor');

我尝试通过更改代码来解决问题,如下所示:

.factory('authInterceptor', function(authToken) {

  return {
    request: function(config) {
      var currentToken = authToken.getToken();
      var token = currentToken ? currentToken : null;

      if (token)  {
        config.headers.Authorization = 'Bearer ' + token;

        return config;
      }
    },
    response: function(response) {
      return response;
    }
  };
});

1 个答案:

答案 0 :(得分:1)

您的身份验证拦截器仅有条件地返回config。这是一个逻辑错误。修复如下:

request: function(config) {
  var token = authToken.getToken();

  if (token)  {
     config.headers.Authorization = 'Bearer ' + token;
  }

  return config;
}

重要的是不要将return语句放在if块中。否则,如果没有令牌,则不会返回任何配置,事情会变得毛茸茸。

错误被抛出,因为当没有令牌并且未返回config时,角度serverRequest方法会尝试访问config.headers并发现config未定义因为你没有归还它。