solucion para pagina example estado error codigos code javascript angularjs ionic-framework angular-resource

javascript - para - http/1.1 200 ok



Los códigos de estado de error no están siendo capturados (3)

Estoy tratando de capturar el código de estado de error de HTTP de angular resource (! = 200). Mi servicio, donde tengo recursos definidos: (apiService.js)

.factory(''ApiService'', function($resource, $http, localStorageService, CONFIG) { var base_api_url = api_url = CONFIG.api_url, api_version_prefix = CONFIG.api_version_prefix; return { userDevices: $resource(api_url+''/requestRegistration/userDevices/:action'', {}, { registerDevice: { method: ''POST'', params: { action: '''' } }, verify: { method: ''POST'', params: { action: ''verify'' } }, } } });

El código de mi controlador:

.controller(''LoginCtrl'', function(CONFIG, $scope, $state, $ionicPlatform, $ionicPopup, ApiService) { $scope.data = { username: null }; $scope.registerDevice = function() { if($scope.data.username) { var authenticationResponse = ApiService.userDevices.registerDevice({ username: $scope.data.username }); authenticationResponse.$promise.then(function(result) { // this is always fired, even then response code is 400 or 503 :( I am not able to check response status code. console.log(result); console.log(''success!''); }, function(error){ // this code is not being exectued even when response status code is different then 200 // its never executed at all :( console.log(''error!''); }); } }; });

Cuando envío la solicitud y recibo el código de respuesta 400/503, creo que el código de función (error) debe ejecutarse pero no es así.

En cambio, mi código en $promise.then(function(result)(...) se ejecuta y no puedo detectar un código de estado HTTP de respuesta.

Entonces, mis preguntas:

  1. ¿Por qué no se está ejecutando mi función de manejo de errores?
  2. ¿Cómo puedo detectar códigos de estado de respuesta HTTP?

El primer .catch está convirtiendo los rechazos en cumplidos. Para evitar la conversión, el método .catch debe throw el error.

authenticationResponse.$promise.catch(function(error){ alert(''catched error!!!''); //throw to chain error throw error; }).then(function(result) { // this is always fired, even then response code is 400 or 503 :( console.log(result); console.log(''success!''); //return to chain data return result }, function(error){ // This should be executed when status code is different then 200? // its never executed at all :( console.log(''error!''); //throw to chain rejection throw error; });

Cuando una función omite una declaración return o throw , devuelve undefined . El servicio $q crea una promesa derivada que se resuelve como undefined .

Diagnosticar problemas de ngResource

Para diagnosticar problemas con $resource métodos $resource , agregue un interceptor de respuesta:

userDevices: $resource(api_url+''/requestRegistration/userDevices/:action'', {}, { registerDevice: { method: ''POST'', params: { action: '''' }, interceptor: { response: function (response) { console.log("registerDevice success"); console.log(response.status); return response; }, errorResponse: function (errorResponse) { console.log("registerDevice error"); console.log(errorResponse.status); throw errorResponse; } } }, verify: { method: ''POST'',

El otro aspecto a tener en cuenta es que hay otros interceptores $ http en la aplicación que convierte las respuestas al omitir una instrucción throw .


Puedes usar un interceptor.

Interceptar las solicitudes antes de que se entreguen al servidor y las respuestas antes de que se entreguen al código de la aplicación que inició estas solicitudes.

Por lo tanto, esto detectará todos los errores de respuesta que se originen en $ http con $ recurso.

$httpProvider.interceptors.push(function($q) { return { ''responseError'': function(response) { if (response.status == 400) { // Handle 400 error code } if (response.status == 503) { // Handle 503 error code } // Rejects the derived promise. return $q.reject(response); } }; });