26

Angular.js v1.0.6

Quando si effettua una $ http.post e la ricezione di un non 200 resposne (401 in questo caso)

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

angolare tiri il seguente errore:

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) 

e non chiama mai il sia il .success() callback o .error() errback rendendo impossibile per gestire la risposta.

Sto facendo qualcosa di sbagliato? La chiamata di successo viene chiamata come previsto sulla fornitura di credenziali legit.

200 risposta:

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 risposta:

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

Inoltre, se adotto la sintassi promessa normale a favore del .success() scorciatoie ottengo un comportamento interessante:

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

risposta

39

Finalmente arrivato alla fine di questo. Il problema era dovuto al seguente implementazione intercettore HTTP globale:

'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

Ho avuto un problema simile, ma nel mio esempio io non volevo propagare l'esecuzione alle promesse locali, ecco perché invece di restituire $ q.reject (response) restituisco semplicemente un oggetto vuoto {}; – macpak

+0

Grazie. Ho anche avuto questo problema per molto tempo. Alla fine l'ho risolto anch'io. –