Angular.js $ http.post TypeError: Impossible de lire les "données" des propriétés d'undefined

Angular.js v1.0.6

Lorsque vous faites un $ http.post et que vous recevez un non 200 resposne (401 dans ce cas)

$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'); }); 

Angular lance l'erreur suivante:

 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) 

Et n'appelle jamais ni l' .success() callback ou .error() ce qui rend impossible la gestion de la réponse.

Est-ce que je fais quelque chose de mal? Le rappel de réussite est appelé comme prévu sur la fourniture de titres de compétences légaux.

200 réponse:

 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 réponse:

 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" } ] } 

En outre, si j'adopte la syntaxe de promesse normale en faveur des raccourcis .success (), j'ai un comportement intéressant:

 $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'); }); 

Finalement, c'est au fond de ça. Le problème était dû à l'implémentation HTTP interceptor HTTP suivante:

 '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 } 

RÉPARER:

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