Comment gérer les erreurs de service $ resource dans AngularJS

96

Je fais des demandes à mon API et j'utilise le module de ressources AngularJS $. C'est différent de $ http donc je ne sais pas comment gérer mes erreurs.

Mon service:

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,

            }
        });
    }]);

Mon contrôleur:

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

Je veux quelque chose comme ça ou .. Je ne connais pas de moyen de gérer les erreurs si mon API ne fonctionne pas.

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

Réponses:

180

vous pouvez passer le gestionnaire d'erreurs comme deuxième paramètre à query.

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

ÉDITER:

pour rendre les choses un peu plus claires, quelques exemples:

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
la source
2
Dans la documentation, il ressemble plus au 3ème paramètre est le rappel d'erreur. "Resource.action ([parameters], [success], [error])" docs.angularjs.org/api/ngResource.$resource
Marcel
4
existe-t-il un moyen de définir un gestionnaire d'erreurs par défaut commun à toute utilisation de cette ressource (ex: "ressource non autorisée par le serveur"?
Nicolas Janel
2
@NicolasJanel Vous pourriez définir une fonction qui la gérerait ensuite Resource.query().$promise.then(function(data) {}, errorFunction). Vous devrez toujours l'inclure à chaque endroit où vous utilisez une requête, mais au moins vous ne la redéfinirez pas à chaque fois.
schillingt
@valkirilov J'apprécierais que vous acceptiez ceci comme réponse à cette question
marco.eig
2
@Kaspar la valeur de retour des méthodes d'instance telles que myResource.$saveet myResource.$deleteest la promesse. Vous pouvez donc le faire myResource.$save().then(...).
Carl G
68

Vous pouvez définir un gestionnaire d'erreurs à l'étape de création de la ressource en ajoutant un interceptorobjet dans la description d'une méthode, avec une responseErrorpropriété, liée à votre fonction d'erreur.

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

resourceErrorHandlerest une fonction appelée sur chaque erreur sur la méthode get ou query. Pour le problème posé, la méthode get est la seule nécessaire. Bien sûr, vous pouvez l'appliquer à n'importe quelle action.

Un autre intercepteur responseexiste pour $ resource pour attraper une réponse normale.

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

Les intercepteurs font partie du $httpmodule, vous pouvez en savoir plus sur eux dans leur documentation .

Nicolas Janel
la source
1

Voici un nouvel exemple ES6 (j'utilise TypeScript) sur mon ng.resource

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

puis dans mon contrôleur, le `` détail '' injecté dans le contrôleur sera soit résolu en données (bonnes), soit fausses pour erreur, où je gère l'affichage de 404.

httpete
la source