流星延迟补偿和日期()

时间:2016-01-02 03:12:23

标签: mongodb meteor methods

我一直在使用共享方法,但在某些情况下仍然无法弄清楚它们的行为。

当我调用一个共享方法时,它会插入如下文档:

Meteor.methods({
  'method': function(){
     Posts.insert({
       'timestamp': new Date()
     });
  }
})

...考虑到Date()在客户端和服务器上会有所不同,延迟补偿仍然有效,这意味着服务器无论如何都会将自己的版本发送给客户端。如果是,是否有任何解决方法,或者我们应该只在服务器端使用带时间戳的插入方法吗?

1 个答案:

答案 0 :(得分:1)

简短回答,是的,即使使用日期插入,延迟补偿也会有效。但是,插入Minimongo客户端的日期最终将被服务器覆盖。

一系列事件看起来像这样:

  1. (客户端)客户端运行其方法版本,将Date插入Minimongo posts集合。假设客户认为它是04:31:03 UTC,而实际上它是04:33:44 UTC。无论如何,现在您的文档客户端具有“不正确”的时间戳。这是正在进行的延迟补偿,这是可以的 - 我们不会等待服务器完成插入,即使该UI不正确,我们也会立即呈现UI。
  2. (服务器)同时,告知服务器执行相同的插入。但服务器知道正确的时间,并将文档插入Mongo,时间为04:33:44 UTC
  3. (客户端)您的客户端可能已订阅posts集合,并且在服务器完成插入后,您的posts订阅会立即观看对集合的更改并通过DDP将文档发送给客户端。
  4. (客户端) Minimongo将此新传入服务器posts文档与其自己的集合合并。在此过程中,它会使用正确的服务器生成时间覆盖不正确的时间。任何相关的用户界面都会被动地更新并反映这一变化。
  5. Kyll建议使用MeteorPad,here's a very basic example。单击“单击我以测试时间戳”字样,您会注意到其下方的毫秒显示闪烁两次:第一次客户端使用自己的时间戳更新,第二次服务器使用ITS时间戳返回时。如果你查看客户端和服务器日志,你会发现这是真的。

    有点啰嗦,但希望这有帮助!如果您需要服务器信任并重新使用客户端生成的日期,只需将Date对象作为参数传递给您的方法,如

    'method': function(date) { 
        check(date, Date);
        Posts.insert({timestamp: date});
    }
    

    但是,您通常希望服务器成为时间戳的真实来源。你永远不能相信客户知道它到底是什么时候!