Meteor数据库mutator如何知道它是从Meteor.method调用而不是普通代码?

时间:2013-10-22 20:14:00

标签: methods meteor rpc

如果有人在客户端做某事,比如

Foo.insert({blah : 1})

其中Foo是Meteor集合,这实际上触发了一个Meteor.method调用,如 http://docs.meteor.com/#meteor_methods 的最后一段所述,它在客户端和服务器

但是,假设我定义了一个方法(在客户端和服务器上),它执行相同的操作:

Meteor.methods({
  bar: function() { 
    Foo.insert({blah : 1}) 
  }
});

现在,我使用

在客户端上触发此操作
Meteor.call("bar");
现在,作为该方法的结果,将在客户端和服务器上调用

Foo.insert。但是,insert的客户端调用如何知道不再调用服务器,因为它本身就是一种方法?

此外,还有一种方法可以在客户端上调用insert,而不会自动触发规范的服务器端延迟补偿调用并产生同步吗? (为什么我想这样做,请参阅Loading a Meteor client app with fake fire-and-forget data

1 个答案:

答案 0 :(得分:1)

客户端一方成为“存根”。它具有此isSimulation属性集,使其看起来好像插入了数据以进行延迟补偿。

我认为如果在客户端上运行.method,则始终启用延迟补偿,并且不应该在数据库中输入。因此,在客户端方法上运行的任何东西都将是“伪造”类型模拟

如果您尝试将this.isSimulation设置为false,您将收到一些奇怪的错误,该错误会向您显示客户端插入开始在插入时引发错误。

我不太确定如何在虚假模拟中运行它。我认为你必须在其他方法var dothis = function() {...}类型方法中运行它。

这样做'假火'&忘记并且只有客户端数据,这是我的假设(如果我错了请更正,所以我更改了答案)修改客户端方法中的_collection属性。

例如,如果你有

mydata = new Meteor.Collection("something");

function something() {
    mydata.insert({..});
}

修改方法以执行此操作

mydata._collection.insert({..});

这将确保数据未与服务器同步,但本地集合将具有此“假数据”。

希望这有帮助!