2

我们在我们的应用程序中使用快速渲染,因此应用程序需要的所有数据都与应用程序本身一起发送。我们没有使用任何 Meteor.subscribe 调用,因为 minimongo 由快速渲染填充。

渲染后,我们运行 Meteor.disconnect()

在未来的某个时候,我们想要重新连接以调用特定的方法,但是当我们重新连接时,minimongo 会被清除。

我们如何防止 Meteor 在重新连接时清除 minimongo 中的所有文档?

4

2 回答 2

2

我怀疑它实际上是导致您的问题的快速渲染。检查流星文档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()

希望这个冗长的答案可以帮助您了解您的应用程序发生了什么。

于 2017-03-24T20:56:06.800 回答
0

我试过了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。

来源:https ://docs.meteor.com/api/connections.html

于 2017-03-25T17:13:32.477 回答