peticiones javascript ajax angularjs

javascript - peticiones - Controlador de error global Ajax con AngularJS



http post angularjs (3)

Cree el archivo <script type="text/javascript" src="../js/config/httpInterceptor.js" ></script> con este contenido:

(function(){ var httpInterceptor = function ($provide, $httpProvider) { $provide.factory(''httpInterceptor'', function ($q) { return { response: function (response) { return response || $q.when(response); }, responseError: function (rejection) { if(rejection.status === 401) { // you are not autorized } return $q.reject(rejection); } }; }); $httpProvider.interceptors.push(''httpInterceptor''); }; angular.module("myModule").config(httpInterceptor); }());

Cuando mi sitio web era 100% jQuery, solía hacer esto:

$.ajaxSetup({ global: true, error: function(xhr, status, err) { if (xhr.status == 401) { window.location = "./index.html"; } } });

para establecer un controlador global para 401 errores. Ahora, uso angularjs con $resource y $http para hacer mis solicitudes (REST) ​​al servidor. ¿Hay alguna forma de configurar de forma similar un controlador de error global con angular?


También estoy construyendo un sitio web con angular y encontré este mismo obstáculo para el manejo global del 401. Terminé usando el interceptor http cuando me encontré con esta publicación en el blog. Tal vez lo encuentres tan útil como yo lo hice.

"Autenticación en la aplicación basada en AngularJS (o similar)". , software espeo

EDITAR: solución final

angular.module(''myApp'', [''myApp.filters'', ''myApp.services'', ''myApp.directives''], function ($routeProvider, $locationProvider, $httpProvider) { var interceptor = [''$rootScope'', ''$q'', function (scope, $q) { function success(response) { return response; } function error(response) { var status = response.status; if (status == 401) { window.location = "./index.html"; return; } // otherwise return $q.reject(response); } return function (promise) { return promise.then(success, error); } }]; $httpProvider.responseInterceptors.push(interceptor);


Tenga en cuenta que ResponseInterceptors ha quedado en desuso con Angular 1.1.4. A continuación puede encontrar un extracto basado en los documentos oficiales , que muestra la nueva forma de implementar interceptores.

$provide.factory(''myHttpInterceptor'', function($q, dependency1, dependency2) { return { ''response'': function(response) { // do something on success return response || $q.when(response); }, ''responseError'': function(rejection) { // do something on error if (canRecover(rejection)) { return responseOrNewPromise; } return $q.reject(rejection); } }; }); $httpProvider.interceptors.push(''myHttpInterceptor'');

Así es como se ve en mi proyecto usando Coffeescript:

angular.module("globalErrors", [''appStateModule'']).factory "myHttpInterceptor", ($q, $log, growl) -> response: (response) -> $log.debug "success with status #{response.status}" response || $q.when response responseError: (rejection) -> $log.debug "error with status #{rejection.status} and data: #{rejection.data[''message'']}" switch rejection.status when 403 growl.addErrorMessage "You don''t have the right to do this" when 0 growl.addErrorMessage "No connection, internet is down?" else growl.addErrorMessage "#{rejection.data[''message'']}" # do something on error $q.reject rejection .config ($provide, $httpProvider) -> $httpProvider.interceptors.push(''myHttpInterceptor'')