【问题标题】:How does a Meteor database mutator know if it's being called from a Meteor.method vs. normal code?Meteor 数据库修改器如何知道它是从 Meteor.method 还是普通代码调用的?
【发布时间】:2013-10-23 06:47:56
【问题描述】:

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

Foo.insert({blah : 1})

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

但是,假设我定义了一个方法(在客户端和服务器上)做同样的事情:

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

【问题讨论】:

    标签: methods meteor rpc


    【解决方案1】:

    客户端成为“存根”。它有这个isSimulation 属性集,使它看起来好像插入了数据以补偿延迟。

    我认为如果在客户端上运行.method,则延迟补偿始终处于启用状态,并且不应进入数据库。所以在客户端方法上运行的任何东西都是“假”类型的模拟

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

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

    要做到这一点,“假火”并忘记并仅拥有客户端数据,这是我的假设(如果我错了,请更正,因此我会更改答案)修改客户端方法中的 _collection 属性。

    例如,如果你有

    mydata = new Meteor.Collection("something");
    
    function something() {
        mydata.insert({..});
    }
    

    修改方法来代替

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2022-01-10
      • 2017-09-04
      • 2018-11-22
      相关资源
      最近更新 更多