我有一个插入的流星方法。 我使用Regulate.js进行表单验证。
我将game_id字段设置为Meteor.uuid()以创建一个唯一值,我也使用铁路由器路由到/ game_show /:game_id。
如你所见,我正在记录游戏的细节,这很好用。 (图片链接记录在下面)
file:/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;
}
});
抱歉上传图片......: - (
从下面的控制台日志图片中可以看出,所有内容都匹配
然而我插入的mongo ID和UUID并不存在,那里唯一的文件除了那两个以外还有其他所有字段匹配!
不确定我做错了什么。谢谢!
答案 0 :(得分:2)
问题是您的代码在客户端运行(或者至少从截图中看起来如此)。
在meteor中,在客户端运行的Meteor.methods
是模拟存根。这意味着你把东西放在那里创建'假'数据,这样你就可以避免用户感觉延迟。这是因为服务器需要1-4秒才能回复实际插入数据库中的内容。这不是一个真正的问题。
这会导致您遇到麻烦的原因是该方法运行两次(一个在服务器上,一个在客户端上),因此它生成两个不同的Meteor.uuid
,因为它们是随机的。所以这就是你不一致的原因。你看到的最初是'假的',然后服务器发送真实的。
这就是Meteor让它看起来像是即时插入数据的方式,即使它尚未完全插入。
要修复此问题,请删除客户端上的.method
,以便只在服务器上运行一个game_id
。您需要从服务器获取Meteor.uuid
,而不是从客户端获取。
如果您想保持延迟补偿,请像data
一样传递game_id
,就像执行其他表单数据一样。这样,{{1}}在服务器和客户端上都是一致的。