我试图通过在集合中插入文档的方法的服务器端代码中添加延迟来测试延迟补偿。这个想法是,当方法运行时,#镜像"在客户端,插入的帖子的标题将具有" (客户端)"连接到它,然后当该方法在服务器中运行时,它将具有" (服务器)"连接到它的标题。由于我为服务器设置了5秒的延迟,我应该看到帖子标题的变化证明了延迟补偿的工作原理。
我实现此方法的文件位于 / lib / collections 文件夹下,因此它应该可以被服务器和客户端访问,但它不起作用,我从来没有看到" (客户端)"标题中的文字,只有" (服务器)"并且帖子在5秒钟后才会显示,所以似乎客户端代码不起作用,只有服务器端代码。
这是定义方法的文件( /lib/collections/post.js )的来源:
Posts=new Mongo.Collection('posts');
Meteor.methods({
postAdd:function(postAttributes){
check(Meteor.userId(),String);
check(postAttributes,{
title:String,
url:String
});
if(Meteor.isServer){
postAttributes.title+=' (server)';
Meteor._sleepForMs(5000);
}else{
postAttributes.title+=' (client)';
}
var posWithTheSameLink=Posts.findOne({url:postAttributes.url});
if(posWithTheSameLink){
return {
postExists:true,
_id:posWithTheSameLink._id
}
}
var user=Meteor.user();
var post=_.extend(postAttributes,{
userId:user._id,
author:user.username,
submitted:new Date()
});
var postId=Posts.insert(post);
return {
_id:postId
};
}
});
这是触发事件的文件( /client/templates/postAdd.js )的来源:
Template.postAdd.events({
'submit form':function(e){
e.preventDefault();
var post={
url:$(e.target).find('[name=url]').val(),
title:$(e.target).find('[name=title]').val(),
user_id:Meteor.userId
};
Meteor.call('postAdd',post,function(error,result){
if(error) return alert(error.reason);
if(result.postExists) alert('This link has been already posted.');
//Router.go('postPage',{_id:result._id});
});
Router.go('postsList');
}
});
如果我在Posts=new Mongo.Collection('posts');
之后的 post.js 文件中添加以下内容:
if(Meteor.isClient){ alert('This is the client!'); }
我确实看到该消息弹出,因此客户端可以定义访问post.js文件。
似乎方法定义中的任何客户端代码都无法正常工作。
我做错了什么?
感谢。
答案 0 :(得分:0)
作为Meteor的初学者,我想知道同样的事情。
我找到了一些关于方法生命周期的信息,您可能会发现它有用,here。
此外,我尝试运行代码的简化版本:
DB = new Mongo.Collection('db');
Meteor.methods({
'test': function(data) {
if (Meteor.isServer) {
data.title += ' (server)';
Meteor._sleepForMs(50000); // here I increased the delay just to be sure
} else {
data.title += ' (client)';
}
DB.insert(data);
if (this.isSimulation) { // logged the output before server response came
console.log(DB.find().fetch());
}
if (Meteor.isServer) {
console.log(DB.find().fetch());
}
}
});
这给了我预期的输出。我从浏览器获得(client)
输出,数据已插入客户端数据库,但未插入服务器端数据库。一旦服务器端数据库获得新数据,我的客户端文档就会自动更改为(server)
。