Behandlung von $ resource service-Fehlern in AngularJS


96

Ich stelle Anfragen an meine API und verwende das AngularJS $ -Ressourcenmodul. Es unterscheidet sich von $ http, daher weiß ich nicht, wie ich mit meinen Fehlern umgehen soll.

Mein 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,

            }
        });
    }]);

Mein Controller:

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

Ich möchte so etwas oder ... Ich weiß nicht, wie ich mit Fehlern umgehen kann, wenn meine API nicht funktioniert.

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

Antworten:


179

Sie können den Fehlerbehandler als zweiten Parameter an übergeben query.

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

BEARBEITEN:

Um die Dinge etwas klarer zu machen, einige Beispiele:

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
In der Dokumentation sieht es eher so aus, als ob der dritte Parameter der Fehlerrückruf ist. "Resource.action ([Parameter], [Erfolg], [Fehler])" docs.angularjs.org/api/ngResource.$resource
Marcel

4
Gibt es eine Möglichkeit, einen Standardfehler-Handler zu definieren, der allen Benutzern dieser Ressource gemeinsam ist (z. B. "Ressource nicht vom Server autorisiert"?
Nicolas Janel

2
@NicolasJanel Sie könnten eine Funktion definieren, die damit umgehen würde Resource.query().$promise.then(function(data) {}, errorFunction). Sie müssen es immer noch an jeder Stelle einfügen, an der Sie eine Abfrage verwenden, aber zumindest werden Sie es nicht jedes Mal neu definieren.
Schillingt

@valkirilov Ich würde es begrüßen, wenn Sie dies als Antwort auf diese Frage akzeptieren
marco.eig

2
@Kaspar der Rückgabewert von Instanzmethoden wie myResource.$saveund myResource.$deleteist das Versprechen. Also kannst du es einfach tun myResource.$save().then(...).
Carl G

68

Sie können einen Fehlerbehandler im Erstellungsschritt der Ressource definieren, indem Sie interceptorin der Beschreibung einer Methode ein Objekt mit einer responseErrorEigenschaft hinzufügen , die mit Ihrer Fehlerfunktion verknüpft ist.

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

Dabei resourceErrorHandlerwird bei jedem Fehler beim Abrufen oder Abfragen eine Funktion aufgerufen. Für das gestellte Problem wird nur die Methode get benötigt. Natürlich können Sie das auf jede Aktion anwenden.

Es gibt einen anderen Interceptor responsefür $ resource, um eine normale Antwort zu erhalten.

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

Interceptors sind Teil des $httpModuls. Weitere Informationen hierzu finden Sie in den Dokumenten .


1

Hier ist ein neues ES6-Beispiel (ich verwende TypeScript) für meine ng.resource

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

und dann wird in meinem Controller 'Detail', das in den Controller injiziert wird, entweder in die Daten (gut) oder falsch für Fehler aufgelöst, wo ich die Anzeige von 404 behandle.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.