繁体   English   中英

流星,客户端和服务器之间的通信

[英]Meteor, communication between the client and the server

这是待办事项列表教程的摘录。 在客户端和服务器端都表示checked变量? 客户端和服务器如何通信以使checked一致?

Template.task.events({
  'click .toggle-checked'() {
    // Set the checked property to the opposite of its current value
    Tasks.update(this._id, {
      $set: { checked: ! this.checked },
    });                                                                                                              
  },
  'click .delete'() {
    Tasks.remove(this._id);
  },
});

checked是在Tasks对象上定义的属性,如此应用程序中所定义。

在Meteor中,此对象的确定记录存储在服务器上(在MongoDB ),但是这里有一个也在操作的客户端缓存,称为MiniMongo 流星框架在后台(通过DDP协议)做了很多工作,以使服务器和客户端对象保持同步。

在这种情况下,当用户单击Tasks.update方法中的复选框(触发'click .toggle-checked'事件代码)时,会发生以下情况:

  1. 首先更新客户端MiniMongo缓存-这被​​称为Optimistic UI ,并使客户端UI能够快速响应(无需等待服务器)
  2. 通过将clicked变量设置为新值,向服务器发送一条消息( Meteor Method ),该消息是客户端要更新Tasks对象。
  3. 服务器收到请求更新的消息,该消息会检查此操作是否有效,然后进行处理(更新Tasks对象的MongoDB版本,或者拒绝适当处理更新。
  4. 服务器将向所有已订阅包含该发布的发布的客户端发送Tasks对象的结果状态的DDP更新。
  5. 先前已订阅的客户端将收到此DDP更新,并将其MiniMongo版本替换为服务器的Tasks对象版本,以确保所有客户端都与服务器同步。

现在,在理想情况下,当服务器接受客户端更改时,启动客户端接收到的新版本Tasks (在步骤5中)将与乐观地更新的对象(在步骤1中)匹配。

但是,通过执行所有这些步骤,Meteor框架还可以同步其他客户端,并在服务器拒绝更新或可能修改其他字段(适用于该应用程序)时处理这种情况。

幸运的是,这都是由Meteor框架处理的,您所需要做的就是调用Tasks.update以使所有这些魔术发生!

流星喜欢模糊客户端和服务器之间的界限。 您可以执行某些操作来抽象代码-例如,在/server目录中的javascript文件(在所有文件中)以限制对其的访问。 这意味着客户端用户看不到此代码。

/client显然是相反的。 您可以使用isClientisServer检查文件。

现在,这对您的代码意味着什么?

根据您的代码的位置,有不同的访问级别。 但是,在脚本内部,基本上没有区别。 在该脚本内的服务器/客户端上,被checked是已知的,因为这是Meteor的运行方式,客户端和服务器之间的模糊线使这成为可能。

流星使用了一种称为“无处不在的数据库”的东西,这意味着在哪里调用代码都没有关系,因为它将运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM