Como lidar com erros de serviço de $ resource em AngularJS

96

Estou fazendo solicitações à minha API e estou usando o módulo de recursos $ AngularJS. É diferente de $ http, então não sei como lidar com meus erros.

Meu serviço:

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,

            }
        });
    }]);

Meu controlador:

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

Quero algo assim ou ... Não sei como lidar com erros se minha API não estiver funcionando ..

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

Respostas:

179

você pode passar o manipulador de erros como um segundo parâmetro para query.

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

EDITAR:

para tornar as coisas um pouco mais claras, alguns exemplos:

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
fonte
2
Na documentação, parece mais que o terceiro parâmetro é o retorno de chamada do erro. "Resource.action ([parâmetros], [sucesso], [erro])" docs.angularjs.org/api/ngResource.$resource
Marcel
4
existe uma maneira de definir um manipulador de erro padrão comum a todos os usos deste recurso (por exemplo, "recurso não autorizado pelo servidor"?
Nicolas Janel
2
@NicolasJanel Você poderia definir uma função que faria isso e então faria Resource.query().$promise.then(function(data) {}, errorFunction). Você ainda terá que incluí-lo em todos os locais em que usar uma consulta, mas pelo menos não o redefinirá a cada vez.
Schillingt de
@valkirilov Agradeço se você aceitar essa resposta para esta pergunta
marco.eig
2
@Kaspar o valor de retorno de métodos de instância como myResource.$savee myResource.$deleteé a promessa. Então você pode apenas fazer myResource.$save().then(...).
Carl G
68

Você pode definir um manipulador de erros na etapa de criação do recurso, adicionando um interceptorobjeto na descrição de um método, com uma responseErrorpropriedade, vinculada à sua função de erro.

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

onde resourceErrorHandleré uma função chamada em cada erro no método get ou query. Para o problema solicitado, o método get é o único necessário. Claro que você pode aplicar isso a qualquer ação.

Existe um outro interceptor responsepara $ resource para capturar uma resposta normal.

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

Os interceptores fazem parte do $httpmódulo, você pode ler mais sobre eles em seus documentos .

Nicolas Janel
fonte
1

Aqui está um novo exemplo ES6 (eu uso TypeScript) em meu ng.resource

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

e então no meu controlador, 'detalhe' injetado no controlador irá resolver para os dados (bom) ou falso para erro, onde eu manejo a exibição de 404.

httpete
fonte