1

挿入を行う流星メソッドがあります。フォームの検証にRegulate.jsを使用しています。

game_id フィールドを Meteor.uuid() に設定して一意の値を作成し、Iron Router を使用して /game_show/:game_id にもルーティングします。

ご覧のとおり、ゲームの詳細をログに記録していますが、これは正常に機能します。(以下のログへの画像リンク)

ファイル: /lib/methods.js

Meteor.methods({
create_game_form : function(data){

    Regulate.create_game_form.validate(data, function (error, data) {
      if (error) {
        console.log('Server side validation failed.');
      } else {
        console.log('Server side validation passed!');
        // Save data to database or whatever...
        //console.log(data[0].value);
        var new_game = {
            game_id: Meteor.uuid(),
            name : data[0].value,
            game_type: data[1].value,
            creator_user_id: Meteor.userId(),
            user_name: Meteor.user().profile.name,
            created: new Date()
        };
        console.log("NEW GAME BEFORE INSERT:  ", new_game);
        GamesData.insert(new_game, function(error, new_id){

            console.log("GAMES NEW MONGO ID: ", new_id)
            var game_data = GamesData.findOne({_id: new_id});

            console.log('NEW GAME AFTER INSERT:  ', game_data);
            Session.set('CURRENT_GAME', game_data);

        });
      }
    });         
  }
 });

この時点で console.log から出力されるすべてのデータは正常に動作します

このメソッドを呼び出した後、クライアントは /game_show/:game_id にルーティングします

Meteor.call('create_game_form', data, function(error){  
    if(error){
        return alert(error.reason);
    }
    //console.log("post insert data for routing variable " ,data);

    var created_game = Session.get('CURRENT_GAME');

    console.log("Session Game ", created_game);
    Router.go('game_show',  {game_id: created_game.game_id});

});

このビューで、挿入したばかりの game_id でドキュメントを読み込もうとします

Template.game_start.helpers({
game_info: function(){      
    console.log(this.game_id);
    var game_data = GamesData.find({game_id: this.game_id});
    console.log("trying to load via UUID ", game_data);
    return game_data;
}
});

申し訳ありませんが、画像をアップロードできません... :-(

https://www.evernote.com/shard/s21/sh/c07e8047-de93-4d08-9dc7-dae51668bdec/a8baf89a09e55f8902549e79f136fd45

以下のコンソール ログの画像からわかるように、すべてが一致しています。

  • 挿入前に記録された ID
  • findOne() を使用して挿入コールバックに記録された ID
  • URL で渡された ID

ただし、挿入したmongo IDとUUIDは存在しません。そこにある唯一のドキュメントには、これら2つを除いて他のすべてのフィールドが一致しています!

何が間違っているのかわかりません。ありがとう!

4

1 に答える 1

2

問題は、コードがクライアント側で実行されていることです (または、少なくともスクリーンショットのように見えます)。

meteor ではMeteor.methods、クライアント側で実行されるのはシミュレーション スタブです。これが意味することは、ユーザーが遅延を感じるのを避けることができるように、「偽の」データを作成するものをそこに置くことです。これは、サーバーがデータベースに実際に挿入された内容を返信するのに 1 ~ 4 秒かかるためです。ただし、これは実際には問題ではありません。

これが問題を引き起こす理由は、メソッドが 2 回 (サーバー上で 1 つとクライアント上で 1 つ) 実行されるため、Meteor.uuidランダムであるため 2 つの異なる が生成されるためです。これが、矛盾がある理由です。最初に表示されるのは「偽の」もので、次にサーバーが本物のものを送信します。

これは、Meteor がデータがまだ完全に挿入されていない場合でも、データが即座に挿入されたように見せる方法です。

これを修正する.methodには、クライアントにある を削除して、サーバー上で 1 つだけ実行するようにします。game_idただし、クライアントからではなく、サーバーから取得する必要があります。

レイテンシ補正を維持したい場合Meteor.uuiddata、他のフォーム データと同じように を渡します。このようにgame_idして、サーバーとクライアントの両方で一貫性が保たれます。

于 2013-11-05T21:59:19.450 に答える