标准连接

我们维护一个WebSocket连接以与MoralisLiveQuery服务器进行通信。在服务器端使用时,我们使用ws包,在浏览器中使用window.WebSocket。我们认为在大多数情况下,没有必要直接处理WebSocket连接。因此,我们开发了一个简单的API,让您专注于自己的业务逻辑。

创建订阅

let query = new Moralis.Query('Game');let subscription = await query.subscribe();

你得到的订阅实际上是一个事件发射器。有关事件发射器的更多信息,请查看此处。您将通过此订阅获得LiveQuery事件。当您第一次调用subscribe时,我们将尝试为您打开与LiveQuery服务器的WebSocket连接。

事件处理

我们定义了几种类型的事件,您将通过订阅对象获得:

打开事件

subscription.on('open', () => { console.log('subscription opened');});

当您调用​query.subscribe()​时,我们会向LiveQuery服务器发送一个订阅请求。当我们从LiveQuery服务器获得确认时,将发出此事件。

当客户端无法维护WebSocket连接并与LiveQuery服务器断开连接时,我们将尝试自动重新连接LiveQuery服务器。如果我们重新连接LiveQuery服务器并成功重新订阅MoralisQuery,您也会收到此事件。

创建事件

subscription.on('create', (object) => {  console.log('object created');});

当创建一个新的MoralisObject并满足您订阅的MoralisQuery时,您将收到此事件。该对象是创建的MoralisObject。

注意:在新的Nitro服务器上,对于自动同步的表(例如同步事件),将使用更新而不是创建。

更新事件

subscription.on('update', (object) => {  console.log('object updated');});

当现有MoralisObject满足MoralisQuery时,您的订阅会更新(MoralisObject在更改前后满足MoralisQuery),您将收到此事件。该对象是已更新的MoralisObject。它的内容是MoralisObject的最新值。

进入事件

subscription.on('enter', (object) => {  console.log('object entered');});

当现有MoralisObject的旧值不满足MoralisQuery但其新值满足MoralisQuery时,您将收到此事件。对象是进入MoralisQuery的MoralisObject。它的内容是MoralisObject的最新值。

离开事件

subscription.on('leave', (object) => {  console.log('object left');});

当现有MoralisObject的旧值满足MoralisQuery但其新值不满足MoralisQuery时,您将收到此事件。对象是离开MoralisQuery的MoralisObject。它的内容是MoralisObject的最新值。

删除事件

subscription.on('delete', (object) => {  console.log('object deleted');});

当满足MoralisQuery的现有MoralisObject被删除时,您将收到此事件。对象是被删除的MoralisObject。

关闭事件

subscription.on('close', () => {  console.log('subscription closed');});

当客户端失去与LiveQuery服务器的WebSocket连接并且我们无法获得更多事件时,您将获得此事件。

退订

subscription.unsubscribe();

如果您想停止接收来自MoralisQuery的事件,您只需取消订阅即可。之后,您将不会从订阅对象中获得任何事件。

关闭

Moralis.LiveQuery.close();

使用完LiveQuery后,您可以调用​Moralis.LiveQuery.close()​。此函数将关闭与LiveQuery服务器的WebSocket连接,取消自动重新连接,并取消订阅所有基于它的订阅。如果在此之后调用​query.subscribe()​,我们将创建一个到LiveQuery服务器的新WebSocket连接。

设置服务器URL

Moralis.liveQueryServerURL = 'ws://XXXX'

大多数情况下,您不需要手动设置它。如果您设置了​Moralis.serverURL​,我们将尝试提取主机名并使用ws://hostname作为默认的liveQueryServerURL。但是,如果您想定义自己的liveQueryServerURL或使用不同的协议(例如wss),则应自行设置。

WebSocket状态

我们公开了三个事件来帮助您监控WebSocket连接的状态:

打开事件

Moralis.LiveQuery.on('open', () => {  console.log('socket connection established');});

当我们与LiveQuery服务器建立WebSocket连接时,您将收到此事件。

关闭事件

Moralis.LiveQuery.on('close', () => {  console.log('socket connection closed');});

当我们失去与LiveQuery服务器的WebSocket连接时,您将收到此事件。

错误事件

Moralis.LiveQuery.on('error', (error) => {  console.log(error);});

当发生网络错误或LiveQuery服务器错误时,您将收到此事件。

重新连接

由于整个LiveQuery功能依赖于与LiveQuery服务器的WebSocket连接,因此我们总是尝试保持打开的WebSocket连接。

因此,当与LiveQuery服务器的连接丢失时,我们会尝试自动重新连接。我们在引擎盖下做指数回退。

但是,如果WebSocket连接由于​Moralis.LiveQuery.close()​或​client.close()​而关闭,我们将取消自动重新连接。

SessionToken

当您订阅MoralisQuery时,我们会将​sessionToken​发送到LiveQuery服务器。对于标准API,我们默认使用当前用户的​sessionToken​。对于高级API,您可以在订阅MoralisQuery时使用任何​sessionToken​。需要注意的重要一点是,当您注销或您使用的​sessionToken​无效时,您应该取消订阅并重新订阅MoralisQuery。否则,您可能会遇到安全问题,因为您会收到不应该发送给您的事件。

使用Moralis.Query.or和两个查询的示例

let query1 = new Moralis.Query('test_subscription');let query2 = new Moralis.Query('test_subscription');query1.equalTo('a', undefined)query2.equalTo('a', '10')mainQuery = Moralis.Query.or(query1, query2);let subscription = await mainQuery.subscribe();subscription.on('create', (object) => {  console.log('object created', object);});subscription.on('update', (object) => {  console.log('object updated', object);});