2

だから、私は次のようなことをしようとしていました:

if(Meteor.isServer){
    Meteor.methods({connect_to_api: function(vars){
        // get data from remote API
        return data;
    }});
}

if(Meteor.isClient){
    Template.myTpl.content = function(){
        Meteor.call('connect_to_api', vars, function(err,data){
            Session.set('placeholder', data);
        });
        return Session.get('placeholder');
    };
}

これは問題なく動作しているように見えましたが、もちろん、Session オブジェクトがサーバーから削除されたため、0.5.9 で機能しなくなりました。サーバーのみ(クライアントにロードしたくないもの)のメソッド呼び出しを使用するリアクティブなテンプレートを作成し、そのメソッド呼び出しからデータを取得するにはどうすればよいでしょうか。サーバー上に存在しないため、コールバック関数にセッション参照を配置することはできません。また、このシナリオで使用できる他のリアクティブ データ ソースを知りません。

私は Meteor にかなり慣れていないので、将来的に保証される可能性が最も高いベスト プラクティスを突き止めようとしています。どうやら上記の実装はそうではありませんでした。

編集:明確にするために、これはテンプレート関数から戻ったときの問題ではありません。これは、サーバー上に存在するセッションの問題です。上記のコードは、サーバー上で次のエラー メッセージを生成します。

Exception while invoking method 'connect_to_api' ReferenceError: Session is not defined
at Meteor.methods.connect_to_api (path/to/file.js:#:#)
at _.extend.protocol_handlers.method.exception ... etc etc
4

2 に答える 2

1

コールバックでセッションを設定するとうまくいくようです。github で作成したこのプロジェクトを参照してください: https://github.com/jtblin/meteor_session_test。この例では、サーバー メソッドでデータを返し、コールバックでセッションに設定します。

コードには 2 つの問題があります。

1) に閉じ括弧の配置がありませんMeteor.methods。コードは次のようになります。

Meteor.methods({
    connect_to_api: function(vars) {
        // get data from remote API
        return data;
    }
});

2) 上記で説明したように、コールバックが完了する前、つまりコールバック メソッドがセッション変数を設定する前に、セッションで値を返します。これが、セッション変数にまだデータが表示されない理由だと思います。

于 2013-03-18T23:19:35.957 に答える
0

私はばかのように感じます(初めてでも最後でもありません)。Session.set が実際にコールバックで機能することを示してくれた jtblin に感謝し、Meteor.method 関数を調べてみました。私がSession.getを使用していたコードに、エラーをスローしていた場所が1つ埋もれていることが判明しました。メソッド自体で値を取得しようとするのではなく、クライアントからその値を渡すと、すべてがうまくいきました。

ああ、確かに上記のように問題なく注文できます。

于 2013-03-19T04:35:55.423 に答える