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

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

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 .


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.