1

非同期メソッドを使用するときに Meteor でエラーを適切に処理する方法を知りたいです。次のことを試しましたが、エラー パラメータではなく、クライアント コールバックの結果パラメータでエラーが返されます。

サーバーコード:

Future = Npm.require('fibers/future');

Meteor.methods({
    'myServerMethod': function(){
        var future = new Future();

        // URL to some remote API
        var url = UrlOfTheApiIWantToCall;

        HTTP.get(url, {//other params as a hash},
            function (error, result) {
                if (!error) {
                    future.return(result);
                } else {
                    future.return(error);
                }
            }
        );

        return future.wait();
    }
});

クライアントコード:

Meteor.call('myServerMethod', function (error, result) {
    if(error){
        console.warn(error);
    }

    console.log('result', result);
});

上で言ったように、「エラー」は、サーバー側の HTTP.get() がエラーを返したときに、クライアント側のイベントで常に未定義です。サーバー側でも に置き換えfuture.return(error);てみましfuture.throw(error);たが、これは本当にサーバー側でエラーをスローします。サーバーでスローされたエラーは 401 Unauthorized エラーでしたが、クライアント側のエラー パラメーターは 500 サーバー エラーを取得します。

では、クライアント コールバックがサーバー コールバックと同じエラー パラメータを受け取るように、Fiber の Future を適切に使用することは可能ですか?

4

1 に答える 1

4

http://docs.meteor.com/#/full/meteor_errorMeteor.Errorのドキュメントによると

メソッドはあらゆる種類の例外をスローできます。しかし、Meteor.Error は、サーバーがクライアントに送信する唯一の種類のエラーです。メソッド関数が別の例外をスローした場合、それはネットワーク上でサニタイズされたバージョンにマップされます。具体的には、スローされたエラーのsanitizedErrorフィールドがMeteor.Errorに設定されている場合、そのエラーはクライアントに送信されます。それ以外の場合、サニタイズされたバージョンが利用できない場合、クライアントは Meteor.Error(500, 'Internal server error') を取得します。

500 Server Errorこれが、クライアントでを受け取っている理由です。エラーメッセージを保存してクライアントに送信したい場合は、次のようにすることができます:

Future = Npm.require('fibers/future');

Meteor.methods({
    'myServerMethod': function(){
        var future = new Future();

        // URL to some remote API
        var url = UrlOfTheApiIWantToCall;

        HTTP.get(url, {//other params as a hash},
            function (error, result) {
                if (!error) {
                    future.return(result);
                } else {
                    future.throw(error);
                }
            }
        );

        try {
            return future.wait();
        }
        catch(err) {
            // Replace this with whatever you want sent to the client.
            throw new Meteor.Error("http-error", err);
        }
    }
});
于 2015-08-14T19:02:52.790 に答える