Jak radzić sobie z błędami usługi $ resource w AngularJS

96

Wysyłam żądania do mojego API i używam modułu zasobów AngularJS $. Różni się od $ http, więc nie wiem, jak sobie radzić z błędami.

Moja usługa:

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,

            }
        });
    }]);

Mój kontroler:

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

Chcę coś takiego lub ... Nie wiem, jak radzić sobie z błędami, jeśli moje API nie działa.

Category.query().success(function() {
                console.log('success');
            }).error(function() {
                console.log('error');
            });
valkirilov
źródło

Odpowiedzi:

180

możesz przekazać obsługę błędów jako drugi parametr do query.

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

EDYTOWAĆ:

aby trochę wyjaśnić, kilka przykładów:

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
źródło
2
W dokumentacji wygląda bardziej na to, że trzeci parametr to wywołanie zwrotne błędu. „Resource.action ([parametry], [sukces], [błąd])” docs.angularjs.org/api/ngResource.$resource
Marcel
4
czy istnieje sposób zdefiniowania domyślnej procedury obsługi błędów wspólnej dla wszystkich użytkowników tego zasobu (np. "zasób nieautoryzowany przez serwer"?
Nicolas Janel
2
@NicolasJanel Możesz zdefiniować funkcję, która by to obsługiwała Resource.query().$promise.then(function(data) {}, errorFunction). Nadal będziesz musiał uwzględniać to w każdym miejscu, w którym używasz zapytania, ale przynajmniej nie będziesz go przedefiniowywać za każdym razem.
schillingt
@valkirilov Byłbym wdzięczny, gdybyś zaakceptował to jako odpowiedź na to pytanie
marco.eig
2
@Kaspar zwraca wartość metod instancji, takich jak myResource.$savei myResource.$deletejest obietnicą. Możesz więc po prostu zrobić myResource.$save().then(...).
Carl G
68

Możesz zdefiniować procedurę obsługi błędów na etapie tworzenia zasobu, dodając interceptorobiekt w opisie metody z responseErrorwłaściwością połączoną z funkcją błędu.

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

gdzie resourceErrorHandlerjest funkcją wywoływaną przy każdym błędzie metody get lub zapytania. W przypadku zadanego problemu jedyną potrzebną jest metoda get. Oczywiście możesz to zastosować do dowolnej akcji.

Dla response$ resource istnieje inny przechwytywacz , który przechwytuje normalną odpowiedź.

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

Interceptory są częścią $httpmodułu, możesz o nich przeczytać w ich dokumentach .

Nicolas Janel
źródło
1

Oto nowy przykład ES6 (używam TypeScript) na moim ng.resource

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

a następnie w moim kontrolerze `` szczegół '' wprowadzony do kontrolera będzie oznaczał dane (dobre) lub fałsz w przypadku błędu, gdzie obsługuję wyświetlanie 404.

httpete
źródło