AngularJSで$ resourceサービスエラーを処理する方法


96

私は自分のAPIにリクエストを出し、AngularJS $ resourceモジュールを使用しています。$ httpとは異なり、エラーの処理方法がわかりません。

私のサービス:

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,

            }
        });
    }]);

私のコントローラー:

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

私はこのようなものを望んでいます。私のAPIが機能していない場合にエラーを処理する方法がわかりません。

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

回答:


179

エラーハンドラを2番目のパラメータとしてに渡すことができますquery

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

編集:

少しわかりやすくするために、いくつかの例:

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
ドキュメントでは、3番目のパラメータがエラーコールバックであるように見えます。"Resource.action([parameters]、[success]、[error])" docs.angularjs.org/api/ngResource.$resource
Marcel

4
このリソースのすべての使用に共通するデフォルトのエラーハンドラーを定義する方法はありますか(たとえば、「リソースはサーバーによって承認されていません」?
Nicolas Janel

2
@NicolasJanelそれを処理する関数を定義してから実行できますResource.query().$promise.then(function(data) {}, errorFunction)。クエリを使用するすべての場所にこれを含める必要がありますが、少なくとも毎回それを再定義することはありません。
シリング2014

@valkirilovこの質問への回答としてこれを受け入れていただければ幸いです
marco.eig

2
このようなインスタンスメソッドの戻り値@Kaspar myResource.$savemyResource.$delete約束です。だから、あなたはただすることができますmyResource.$save().then(...)
カールG

68

リソースの作成ステップでエラーハンドラを定義するにinterceptorは、メソッドの説明にオブジェクトを追加し、responseErrorプロパティを使用して、エラー関数にリンクします。

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

どこresourceErrorHandlerGETまたはクエリメソッドの各エラーに呼び出される関数です。尋ねられた問題については、getメソッドだけが必要です。もちろん、それを任意のアクションに適用できます。

response$ resourceが通常の応答をキャッチするための別のインターセプターが存在します。

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

インターセプターは$httpモジュールの一部であり、それらのドキュメントでそれらについてさらに読むことができます。


1

これは、ng.resourceの新しいES6の例(私はTypeScriptを使用しています)です。

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

次に、私のコントローラーでは、コントローラーに挿入された「詳細」がデータに解決されるか(良好)、エラーの場合はfalseになり、404の表示を処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.