Come gestire gli errori del servizio $ resource in AngularJS


96

Sto effettuando richieste alla mia API e sto usando il modulo di risorse $ AngularJS. È diverso da $ http, quindi non so come gestire i miei errori.

Il mio servizio:

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,

            }
        });
    }]);

Il mio controller:

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

Voglio qualcosa di simile o .. Non conosco un modo per gestire gli errori se la mia API non funziona ..

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

Risposte:


180

puoi passare il gestore degli errori come secondo parametro a query.

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

MODIFICARE:

per rendere le cose un po 'più chiare, alcuni esempi:

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
Nella documentazione sembra più che il terzo parametro sia il callback dell'errore. "Resource.action ([parametri], [successo], [errore])" docs.angularjs.org/api/ngResource.$resource
Marcel

4
c'è un modo per definire un gestore di errori predefinito comune a tutti gli usi di questa risorsa (es. "risorsa non autorizzata dal server"?
Nicolas Janel,

2
@NicolasJanel Potresti definire una funzione che la gestisca e poi fallo Resource.query().$promise.then(function(data) {}, errorFunction). Dovrai comunque includerlo ogni volta che utilizzi una query, ma almeno non la ridefinirai ogni volta.
schillingt

@valkirilov Apprezzerei se accetti questa come risposta a questa domanda
marco.eig

2
@Kaspar il valore di ritorno dei metodi di istanza come myResource.$saveed myResource.$deleteè la promessa. Quindi puoi e basta myResource.$save().then(...).
Carl G

68

È possibile definire un gestore degli errori nella fase di creazione della risorsa aggiungendo un interceptoroggetto nella descrizione di un metodo, con una responseErrorproprietà, collegata alla propria funzione di errore.

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

dove resourceErrorHandlerè una funzione chiamata su ogni errore sul metodo get o query. Per il problema posto, il metodo get è l'unico necessario. Ovviamente puoi applicarlo a qualsiasi azione.

Esiste un altro intercettore responseper $ resource per catturare una risposta normale.

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

Gli intercettatori fanno parte del $httpmodulo, puoi leggere ulteriori informazioni su di loro nei loro documenti .


1

Ecco un nuovo esempio ES6 (io uso TypeScript) sul mio ng.resource

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

e poi nel mio controller, il "dettaglio" iniettato nel controller si risolverà nei dati (buono) o falso per errore, dove gestisco la visualizzazione di 404.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.