26

Angularjs v1.0.6

Wenn sie ein $ http.post und Empfangen eines nicht 200 resposne (401 in diesem Fall)

lesen
$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 führt den folgenden Fehler:

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) 

und nie ruft die entweder die .success() Rückruf oder .error() errback macht es unmöglich, die Antwort zu handhaben.

Mache ich etwas falsch? Der Erfolgsrückruf wird wie erwartet bei der Bereitstellung von legitimen Berechtigungsnachweisen aufgerufen.

200 Antwort:

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

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

Weiter, wenn ich die normale Versprechen Syntax für den .success() Abkürzungen adoptieren bekomme ich einige interessante Verhalten:

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

Antwort

39

Endlich auf den Grund dieser. Das Problem war, aufgrund der folgenden globalen HTTP Interzeptorimplementierung:

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

UPDATE:

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

Ich hatte ein ähnliches Problem, aber in meinem Beispiel wollte ich nicht zu propagieren die Ausführung auf lokale Versprechungen, deshalb gebe ich, anstatt $ q.reject (response) zurückzusenden, einfach ein leeres Objekt zurück {}; – macpak

+0

Danke. Ich hatte dieses Problem auch lange Zeit. Endlich habe ich es auch repariert. –

Verwandte Themen