Cómo manejar los errores del servicio $ resource en AngularJS

96

Estoy haciendo solicitudes a mi API y estoy usando el módulo de recursos AngularJS $. Es diferente de $ http, así que no sé cómo manejar mis errores.

Mi servicio:

var appServices = angular.module('app.services', ['ngResource']);
appServices.factory('Category', ['$resource',
    function($resource){
        return $resource('/apicategoryerr/?format=:format', {}, {
            query: {
                method: 'GET', 
                params: { format: 'json'}, 
                isArray: true,

            }
        });
    }]);

Mi controlador:

...
Category.query(function(data) {
                console.log(data);
            });
...

Quiero algo como esto o ... No sé cómo manejar los errores si mi API no funciona ...

Category.query().success(function() {
                console.log('success');
            }).error(function() {
                console.log('error');
            });
Valkirilov
fuente

Respuestas:

180

puede pasar el controlador de errores como segundo parámetro a query.

Category.query(function(data) {}, function() {});

EDITAR:

para aclarar un poco las cosas, algunos ejemplos:

var Resource = $resource('/restapi/resource');

Resource.query(function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query({
    'query': 'thequery'
},function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query().$promise.then(function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query({
    'query': 'thequery'
}).$promise.then(function(data) {
    // success handler
}, function(error) {
    // error handler
});
marco.eig
fuente
2
En la documentación, parece que el tercer parámetro es la devolución de llamada de error. "Resource.action ([parámetros], [éxito], [error])" docs.angularjs.org/api/ngResource.$resource
Marcel
4
¿Hay alguna manera de definir un controlador de errores predeterminado común a todos los usos de este recurso (por ejemplo, "recurso no autorizado por el servidor"?
Nicolas Janel
2
@NicolasJanel Podrías definir una función que lo manejaría y luego lo haría Resource.query().$promise.then(function(data) {}, errorFunction). Aún tendrá que incluirlo en cada lugar donde use una consulta, pero al menos no lo redefinirá cada vez.
schillingt
@valkirilov Le agradecería que aceptara esto como la respuesta a esta pregunta
marco.eig
2
@Kaspar el valor de retorno de métodos de instancia como myResource.$savey myResource.$deletees la promesa. Así que puedes hacerlo myResource.$save().then(...).
Carl G
68

Puede definir un controlador de errores en el paso de creación del recurso agregando un interceptorobjeto en la descripción de un método, con una responseErrorpropiedad, vinculada a su función de error.

function resourceErrorHandler(response) { ... }

$resource('/path/:param/', {} , 
{
        'get':    {method:'GET', 
                   interceptor : {responseError : resourceErrorHandler}},
        'save':   {method:'POST'},
        'query':  {method:'GET', isArray:true, 
                   interceptor : {responseError : resourceErrorHandler}},
        'remove': {method:'DELETE'},
        'delete': {method:'DELETE'}
};

donde resourceErrorHandleres una función llamada en cada error en el método get o query. Para el problema planteado, el método get es el único necesario. Por supuesto, puede aplicar eso a cualquier acción.

Existe otro interceptor responsepara que $ resource capte una respuesta normal.

 {'get': {method:'GET', interceptor : {response : resourceResponseHandler}},

Los interceptores son parte del $httpmódulo, puede leer más sobre ellos en sus documentos .

Nicolas Janel
fuente
1

Aquí hay un nuevo ejemplo de ES6 (uso TypeScript) en mi ng.resource

resolve: {
    detail: function (myService, $stateParams) {
        return myService.getEventDetail({ id: $stateParams.id }).$promise.then(data => data, error => false );
    }
}

y luego, en mi controlador, el 'detalle' inyectado en el controlador se resolverá en los datos (bueno) o falso para el error, donde manejo la pantalla de 404.

httpete
fuente