26

Angular.js 1.0.6

的属性 '数据' 当进行$ http.post和接收非200 resposne(401在这种情况下)

$http.post('http://localhost:3030/auth/login', { 
    username: 'username', 
    password: 'password' 
}) 
.success(function(data) { 
    // Gets called on a 200 response, but not on a 401 
    console.log('success'); 
}) 
.error(function(err) { 
    // Never gets called & dies with error described below. 
    console.log('error'); 
}); 

角引发以下错误:

TypeError: Cannot read property 'data' of undefined 
    at http://localhost:9000/components/angular/angular.js:8891:22 
    at wrappedCallback (http://localhost:9000/components/angular/angular.js:6797:59) 
    at http://localhost:9000/components/angular/angular.js:6834:26 
    at Object.Scope.$eval (http://localhost:9000/components/angular/angular.js:8011:28) 
    at Object.Scope.$digest (http://localhost:9000/components/angular/angular.js:7876:25) 
    at Object.Scope.$apply (http://localhost:9000/components/angular/angular.js:8097:24) 
    at done (http://localhost:9000/components/angular/angular.js:9111:20) 
    at completeRequest (http://localhost:9000/components/angular/angular.js:9274:7) 
    at XMLHttpRequest.xhr.onreadystatechange (http://localhost:9000/components/angular/angular.js:9244:11) 

而且从来没有调用要么.success()回调或.error() errback可使其无法处理响应。

我做错了什么?在提供合法凭证时,成功回拨会按预期调用。

200响应:

Access-Control-Allow-Headers:Content-Type, Authorization, Content-Length, X-Requested-With, Auth-Token 
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS 
Access-Control-Allow-Origin:* 
Connection:keep-alive 
Content-Length:99 
Content-Type:application/json 
Date:Thu, 16 May 2013 13:57:51 GMT 

{ 
    "auth-token":"676932cc1e183a64334345944ad432d1908f8110bc", 
    "user": { 
    "id":1, 
    "username":"username" 
    } 
} 

401响应:

Access-Control-Allow-Headers:Content-Type, Authorization, Content-Length, X-Requested-With, Auth-Token 
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS 
Access-Control-Allow-Origin:* 
Connection:keep-alive 
Content-Length:45 
Content-Type:application/json 
Date:Thu, 16 May 2013 13:58:25 GMT 

{ 
    "error": [ 
    { 
     "message":"Invalid Credentials" 
    } 
    ] 
} 

而且,如果我采用有利于.success的正常承诺的语法()的快捷方式,我得到了一些有趣的现象:

$http.post('http://localhost:3030/auth/login', { 
    username: username, 
    password: password 
}).then(function (resp) { 
    // On a 200 response, resp is a response object. 
    // On a 401 response, resp is undefined. 
    console.log(resp); 
}, function() { 
    console.log('error'); 
}); 

回答

39

终于到了这个底部。该问题是由于以下全局HTTP拦截器实现:

'use strict'; 
// register the interceptor as a service 
angular.module('imvgm') 
    .factory('httpInterceptor', ['$q', '$rootScope', function($q, $rootScope) { 

    function success(response) { 
    return response; 
    } 

    function error(response) { 
    var status = response.status; 

    if (status === 401) { 
     $rootScope.$broadcast('event:loginRequired'); 
     return 
    } 
    // otherwise 
    return $q.reject(response); 
    } 

    return function(promise) { 
    return promise.then(success, error); 
    }; 

}]); 

NB

if (status === 401) { 
    $rootScope.$broadcast('event:loginRequired'); 
    return // Returns nothing 
} 

FIX:

if (status === 401) { 
    $rootScope.$broadcast('event:loginRequired'); 
} 
+2

我也有类似的问题,但在我的例子我不想将执行传播到本地承诺,这就是为什么而不是返回$ q.reject(响应),我只是返回一个空对象{}; – macpak

+0

谢谢。我也有这个问题很长一段时间。最后我也修正了它。 –

相关问题