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
在服务器和客户端上都是一致的。