javascript - por - interceptor angular 6
Angular.js $ http.post TypeError: no se puede leer la propiedad ''datos'' de indefinido (1)
Angular.js v1.0.6
Al hacer un $ http.post y recibir un resposne no 200 (401 en este 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'');
});
Angular arroja el siguiente 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)
Y nunca llama a la devolución de llamada .success()
ni a la .error()
lo que imposibilita el manejo de la respuesta.
¿Estoy haciendo algo mal? La devolución de llamada exitosa se realiza como se espera al proporcionar las credenciales legítimas.
200 respuesta:
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 respuesta:
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"
}
]
}
Además, si adopto la sintaxis de promesa normal a favor de los accesos directos de .success () obtengo un comportamiento interesante:
$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'');
});
Finalmente llegamos al fondo de esto. El problema se debió a la siguiente implementación de interceptor HTTP global:
''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);
};
}]);
nótese bien
if (status === 401) {
$rootScope.$broadcast(''event:loginRequired'');
return // Returns nothing
}
FIJAR:
if (status === 401) {
$rootScope.$broadcast(''event:loginRequired'');
}