Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript meteor mongodb\u id在插入后发生更改(以及UUID属性)_Javascript_Node.js_Mongodb_Meteor - Fatal编程技术网

Javascript meteor mongodb\u id在插入后发生更改(以及UUID属性)

Javascript meteor mongodb\u id在插入后发生更改(以及UUID属性),javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,我有一个流星的方法,做一个插入。 Im使用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_

我有一个流星的方法,做一个插入。 Im使用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\u show/:game\u 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});

});
在这个视图中,我尝试加载带有我刚刚插入的游戏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;
}
});
抱歉,无法上载图像…:-(

从下面控制台日志的图像中可以看到,所有内容都匹配

  • 插入前记录的id
  • 使用findOne()记录在插入回调中的id
  • 在url中传递的id
但是,我插入的mongo ID和UUID不在那里,其中唯一的文档包含除这两个字段之外的所有其他匹配字段


不确定我做错了什么。谢谢!

问题是您的代码正在客户端运行(或者至少从屏幕截图上看是这样)

在meteor中,
meteor。在客户端运行的方法是模拟存根。这意味着你将创建“假”数据的东西放在那里,这样你就可以避免用户感觉延迟。这是因为服务器需要1-4秒才能回复数据库中实际插入的内容。这不是一个真正的问题不过

这会给您带来麻烦的原因是该方法运行了两次(一次在服务器上,一次在客户端),因此它会生成两个不同的
Meteor.uuid
s,因为它们是随机的。这就是为什么会出现不一致性。您看到的最初是“假”的,然后服务器发送真实的

这就是Meteor如何让数据看起来像是即时插入的,即使它还没有完全插入

要解决此问题,请删除客户端上的
.method
,这样服务器上就只有一个运行。您需要从服务器而不是客户端获取
游戏id


如果您想保持延迟补偿,请在
数据中传递
Meteor.uuid
,就像传递其他表单数据一样。这样,服务器和客户端上的
游戏id
将保持一致。

发布功能是什么样的?顺便问一句,插入uuid的代码在哪里?是否调用uuid两次或两次在将其插入文档?Meteor.publish('all_games',function(){return GamesData.find();})之前在变量中声明它;很抱歉,我不得不重新保存代码,其中设置为静态数字,我将Meteor.uuid()放回,很抱歉发布堆栈溢出使我的代码不完整。我的方法在/lib/methods.js中,它同时在客户端和服务器上运行。如果将它放在
/server/lib
中,它将只在服务器上运行。同样,如果它在
/client
中,它将在客户端上运行。如果它在
//code>中,它将同时在客户端和服务器上运行。请查看非正式的Meteor关于如何构造好应用程序的常见问题:(接近底部)明白了,我在进行方法调用的客户端上生成了uuid,这样我就可以在路由中使用它。