我正在学习Meteor并从根本上享受构建数据驱动应用程序的速度,但是当我通过Discover Meteor书中的Creating Posts章节学习了如何使用服务器端方法时。具体而言,主要原因(并且有许多非常有效的理由使用这些)是因为时间戳。您不希望依赖客户日期/时间,而您想要使用服务器日期/时间。
没有意义,除了在我构建的几乎所有应用程序中,我们在一列中存储行创建/更新的日期/时间。实际上,每次创建或更新数据库都会记录Meteor中的日期/时间,现在我需要使用服务器端方法来确保数据的完整性。
如果我正确理解,几乎消除了客户端集合的易用性和实时性,因为我需要几乎每次更新都使用Methods并创建我们的数据库。
只是想检查并了解其他人是如何在现实世界中这样做的。你只是查询服务器端只返回日期/时间然后使用客户端集合或其他东西的方法?
谢谢!
答案 0 :(得分:6)
对这个问题的简短回答是,是的,影响服务器数据库的每个操作都将通过服务器端方法。唯一的区别是你是否明确地定义了这个方法。
当您刚开始使用Meteor时,您可能会使用validators直接在客户端集合上执行插入/更新/删除操作,这会检查操作是否允许。这种用法实际上是在两者服务器和客户端上调用预定义方法:(对于名为foo
的集合,例如你有/foo/insert
),它只检查指定的验证器之前做手术。随着您对Meteor的熟悉,您可能会覆盖这些默认方法,原因如您所述(等等)。
使用自己的方法时,通常需要在服务器和客户端上定义方法,就像默认的集合函数一样。这是因为Meteor的latency compensation,它允许大多数客户端操作立即反映在浏览器中,没有任何明显的延迟,只要它们被允许。 Meteor通过首先模拟客户端中方法调用的效果,临时更新客户端的缓存数据,然后将实际方法调用发送到服务器来实现此目的。如果服务器的方法导致与客户端模拟不同的一组更改,则将更新客户端的缓存以在服务器方法返回时反映这一点。这也意味着如果客户端的方法与服务器完全相同,我们基本上允许从客户端的角度进行即时操作。
通过在服务器和客户端上定义自己的方法,您可以扩展它以满足您自己的需求。例如,如果要在更新时插入时间戳,请让客户端在模拟方法中插入任何时间戳。服务器将插入一个权威时间戳,该方法将在方法返回时替换客户端的时间戳。从客户端的角度来看,插入操作将是即时的,除非客户端的时间恰好偏离时更新时间戳。 (顺便说一句,您可能需要查看我的 timesync 包,以便在客户端上准确显示相对服务器时间。)
最后一点:了解你在收集操作的范围是很好的,因为这是最初让我误解Meteor的原因之一。例如,如果客户端Foo
中有一个集合实例,则普通客户端代码中的Foo.insert()
将调用默认的客户端/服务器方法对。但是,客户端方法中的Foo.insert()
将仅在模拟中运行,并且永远不会调用服务器代码 - 因此您需要在服务器上定义相同的方法,并确保执行{{ 1}}以及方法正常工作。
向前推进的一个好的经验法则是用您自己的方法替换已验证的集合操作组,这些方法执行相同的操作,然后分别在服务器和客户端上添加特定的额外功能。
答案 1 :(得分:0)
总之 - 是的!
出版物的存在是为了向客户端发送数据库的实时和动态子集,为现有记录发送DDP added
消息,然后发送ready
,然后added
,changed
和deleted
消息使客户端的缓存保持一致。
直接或间接导致Mongo更新的方法,就像安德鲁提到的那样,它们一直在使用。
但实际上,由于Meteor的出版物架构,目前正在发布给至少一个客户的馆藏的任何编辑都将通过DDP发布 - 无论Mongo的变化来源如何 - 甚至是外部过程