标准连接
我们维护一个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);});