我们在我们的应用程序中使用快速渲染,因此应用程序需要的所有数据都与应用程序本身一起发送。我们没有使用任何 Meteor.subscribe 调用,因为 minimongo 由快速渲染填充。
渲染后,我们运行 Meteor.disconnect()
在未来的某个时候,我们想要重新连接以调用特定的方法,但是当我们重新连接时,minimongo 会被清除。
我们如何防止 Meteor 在重新连接时清除 minimongo 中的所有文档?
我们在我们的应用程序中使用快速渲染,因此应用程序需要的所有数据都与应用程序本身一起发送。我们没有使用任何 Meteor.subscribe 调用,因为 minimongo 由快速渲染填充。
渲染后,我们运行 Meteor.disconnect()
在未来的某个时候,我们想要重新连接以调用特定的方法,但是当我们重新连接时,minimongo 会被清除。
我们如何防止 Meteor 在重新连接时清除 minimongo 中的所有文档?
我怀疑它实际上是导致您的问题的快速渲染。检查流星文档Meteor.disconnect()
...
调用此方法断开与服务器的连接并停止所有实时数据更新。当客户端断开连接时,它不会接收到集合的更新,方法调用将排队等待重新建立连接,并且热代码推送将被禁用。
调用 Meteor.reconnect 以重新建立连接并恢复数据传输。
当不需要实时更新时,这可用于节省移动设备的电池电量。
这意味着您的客户端数据永远不会被删除,否则您无法在重新连接时“恢复数据传输”。这也意味着该方法的主要预期用例之一(例如,“用于在不需要实时更新时在移动设备上节省电池”)实际上不会起作用。
为了绝对确定,我检查了流星源以查看断开连接时会发生什么,它所做的一切将连接状态 var 设置为 false,清除连接和心跳计时器,并取消任何挂起的流星方法调用。
同样,Meteor.reconnect()
只需将连接状态 var 设置回 true,重新建立连接和 heartbeat 计时器,重新建立任何订阅(以便可以获取新数据...此操作不会删除客户端数据),并调用任何排队的up 流星方法调用。
在阅读了有关如何快速渲染工作的更多信息后,我了解到已经进行了很多黑客攻击以使其实际工作。跳出来给我的主要黑客是“假准备”黑客,它欺骗客户在实际订阅准备好之前认为订阅已经准备好(因为数据是在初始页面加载时发送到客户端的)。
由于您的应用程序中没有订阅并且Meteor.reconnect()
不会导致您的页面重新加载,我想知道客户端是否从未做任何事情,因为它从未收到另ready
一条消息。或者可能因为 Meteor 不知道任何订阅(因为快速渲染绕过流星来传输数据),它会清除客户端 minimongo 缓存,因此如果开始新订阅,它会处于良好状态。或者,可能还有其他一些关于快速渲染的问题。
长话短说,根据查看文档、源代码以及离线测试我的流星应用程序的经验,我非常确定Meteor.disconnect()
并且不会对您的客户端 minimongo 数据产生影响。Meteor.reconnet()
我不能删除数据,因为我有一个流星应用程序在生产中,如果它检测到它失去了连接(例如计算机离线、网络中断等),它会Meteor.reconnect()
继续调用。Meteor.reconnect()
希望这个冗长的答案可以帮助您了解您的应用程序发生了什么。
我试过了Meteor.disconnect()
,Meteor.reconnect()
Minimongo DB 没有被清除。我使用以下方法确认了它:
a) Minimongo 浏览器: https ://chrome.google.com/webstore/detail/meteor-minimongo-explorer/bpbalpgdnkieljogofnfjmgcnjcaiheg
b)如果在重新连接期间的某个时间点我的集合将有零记录,则返回消息的助手。
尽管您是对的,但订阅中的所有数据都是在重新连接后从服务器发送到客户端(尽管让本地数据库进行同步)。发生这种情况是因为 Meteor 服务器像一个全新的连接一样重新连接。似乎在未来(不确定)Meteor 将部署真正的重新连接,如他们的文档中所述:
目前,当客户端重新连接到服务器时(例如暂时失去 Internet 连接后),它每次都会获得一个新的连接。将再次调用 onConnection 回调,并且新连接将具有新的连接 ID。
将来,当客户端重连完全实现时,从客户端重连将重新连接到服务器上的同一连接:不会再次为该连接调用 onConnection 回调,并且该连接仍将具有相同的连接 ID。