meteor mongodb _id在插入(和UUID属性)后更改

我有meteor的方法,做一个插入。 我使用Regulate.js进行表单validation。

我将game_id字段设置为Meteor.uuid()来创build一个唯一值,我也使用铁路由器路由到/ game_show /:game_id。

正如你所看到的,我正在logging游戏的细节,这工作正常。 (图片链接下面logging)

文件:/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

正如你可以从下面的控制台日志的图像看到的,一切都匹配

  • 在插入之前logging的id
  • 在使用findOne()插入callback的日志中logging
  • 在URL中传递的ID

然而,我插入的mongo ID和UUID不在那里,那里唯一的文档除了那两个以外,其他所有的字段都匹配!

不知道我做错了什么。 谢谢!

问题是你的代码在客户端运行(或者至less从截图看起来像)。

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

造成这种麻烦的原因是该方法运行两次(一个在服务器上,一个在客户端上),所以它会产生两个不同的Meteor.uuid因为它们是随机的。 所以这就是你不一致的原因。 你看到的是最初的“假”,然后服务器发送真正的一个。

这就是meteor使它看起来像数据已被立即插入,即使它没有完全插入。

为了解决这个问题,摆脱客户端上的.method ,以便在服务器上只运行一个。 您需要从服务器获取game_id ,而不是从客户端获取。

如果你想保持延迟补偿,像你做其他表格数据一样传递Meteor.uuid 。 这样game_id在服务器和客户端上都是一致的。