with por pasar parametros example enviar datos con javascript http authentication angularjs http-status-code-401

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