我一直在使用共享方法,但在某些情况下仍然无法弄清楚它们的行为。
当我调用一个共享方法时,它会插入如下文档:
Meteor.methods({
'method': function(){
Posts.insert({
'timestamp': new Date()
});
}
})
...考虑到Date()在客户端和服务器上会有所不同,延迟补偿仍然有效,这意味着服务器无论如何都会将自己的版本发送给客户端。如果是,是否有任何解决方法,或者我们应该只在服务器端使用带时间戳的插入方法吗?
答案 0 :(得分:1)
简短回答,是的,即使使用日期插入,延迟补偿也会有效。但是,插入Minimongo客户端的日期最终将被服务器覆盖。
一系列事件看起来像这样:
Date
插入Minimongo posts
集合。假设客户认为它是04:31:03 UTC
,而实际上它是04:33:44 UTC
。无论如何,现在您的文档客户端具有“不正确”的时间戳。这是正在进行的延迟补偿,这是可以的 - 我们不会等待服务器完成插入,即使该UI不正确,我们也会立即呈现UI。04:33:44 UTC
。posts
集合,并且在服务器完成插入后,您的posts
订阅会立即观看对集合的更改并通过DDP将文档发送给客户端。 posts
文档与其自己的集合合并。在此过程中,它会使用正确的服务器生成时间覆盖不正确的时间。任何相关的用户界面都会被动地更新并反映这一变化。Kyll建议使用MeteorPad,here's a very basic example。单击“单击我以测试时间戳”字样,您会注意到其下方的毫秒显示闪烁两次:第一次客户端使用自己的时间戳更新,第二次服务器使用ITS时间戳返回时。如果你查看客户端和服务器日志,你会发现这是真的。
有点啰嗦,但希望这有帮助!如果您需要服务器信任并重新使用客户端生成的日期,只需将Date
对象作为参数传递给您的方法,如
'method': function(date) {
check(date, Date);
Posts.insert({timestamp: date});
}
但是,您通常希望服务器成为时间戳的真实来源。你永远不能相信客户知道它到底是什么时候!