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