Moralis 實(shí)時(shí)查詢

2022-05-11 14:17 更新

標(biāo)準(zhǔn)連接

我們維護(hù)一個(gè) WebSocket 連接以與 Moralis LiveQuery 服務(wù)器進(jìn)行通信。 在服務(wù)器端使用時(shí),我們使用 ws 包,在瀏覽器中使用 window.WebSocket。 我們認(rèn)為在大多數(shù)情況下,沒有必要直接處理 WebSocket 連接。 因此,我們開發(fā)了一個(gè)簡單的 API,讓您專注于自己的業(yè)務(wù)邏輯。

創(chuàng)建訂閱

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

你得到的訂閱實(shí)際上是一個(gè)事件發(fā)射器。 有關(guān)事件發(fā)射器的更多信息,請查看此處。 您將通過此訂閱獲得 LiveQuery 事件。 當(dāng)您第一次調(diào)用 subscribe 時(shí),我們將嘗試為您打開與 LiveQuery 服務(wù)器的 WebSocket 連接。

事件處理

我們定義了幾種類型的事件,您將通過訂閱對象獲得:

打開事件

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

當(dāng)您調(diào)用 ?query.subscribe()? 時(shí),我們會(huì)向 LiveQuery 服務(wù)器發(fā)送一個(gè)訂閱請求。 當(dāng)我們從 LiveQuery 服務(wù)器獲得確認(rèn)時(shí),將發(fā)出此事件。

當(dāng)客戶端無法維護(hù) WebSocket 連接并與 LiveQuery 服務(wù)器斷開連接時(shí),我們將嘗試自動(dòng)重新連接 LiveQuery 服務(wù)器。 如果我們重新連接 LiveQuery 服務(wù)器并成功重新訂閱 MoralisQuery,您也會(huì)收到此事件。

創(chuàng)建事件

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

當(dāng)創(chuàng)建一個(gè)新的 MoralisObject 并滿足您訂閱的 MoralisQuery 時(shí),您將收到此事件。 該對象是創(chuàng)建的 MoralisObject。

注意:在新的 Nitro 服務(wù)器上,對于自動(dòng)同步的表(例如同步事件),將使用更新而不是創(chuàng)建。

更新事件

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

當(dāng)現(xiàn)有 MoralisObject 滿足 MoralisQuery 時(shí),您的訂閱會(huì)更新(MoralisObject 在更改前后滿足 MoralisQuery),您將收到此事件。 該對象是已更新的 MoralisObject。 它的內(nèi)容是 MoralisObject 的最新值。

進(jìn)入事件

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

當(dāng)現(xiàn)有 MoralisObject 的舊值不滿足 MoralisQuery 但其新值滿足 MoralisQuery 時(shí),您將收到此事件。 對象是進(jìn)入 MoralisQuery 的 MoralisObject。 它的內(nèi)容是 MoralisObject 的最新值。

離開事件

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

當(dāng)現(xiàn)有 MoralisObject 的舊值滿足 MoralisQuery 但其新值不滿足 MoralisQuery 時(shí),您將收到此事件。 對象是離開 MoralisQuery 的 MoralisObject。 它的內(nèi)容是 MoralisObject 的最新值。

刪除事件

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

當(dāng)滿足 MoralisQuery 的現(xiàn)有 MoralisObject 被刪除時(shí),您將收到此事件。 對象是被刪除的 MoralisObject。

關(guān)閉事件

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

當(dāng)客戶端失去與 LiveQuery 服務(wù)器的 WebSocket 連接并且我們無法獲得更多事件時(shí),您將獲得此事件。

退訂

subscription.unsubscribe();

如果您想停止接收來自 MoralisQuery 的事件,您只需取消訂閱即可。 之后,您將不會(huì)從訂閱對象中獲得任何事件。

關(guān)閉

Moralis.LiveQuery.close();

使用完 LiveQuery 后,您可以調(diào)用 ?Moralis.LiveQuery.close()?。 此函數(shù)將關(guān)閉與 LiveQuery 服務(wù)器的 WebSocket 連接,取消自動(dòng)重新連接,并取消訂閱所有基于它的訂閱。 如果在此之后調(diào)用 ?query.subscribe()?,我們將創(chuàng)建一個(gè)到 LiveQuery 服務(wù)器的新 WebSocket 連接。

設(shè)置服務(wù)器 URL

Moralis.liveQueryServerURL = 'ws://XXXX'

大多數(shù)情況下,您不需要手動(dòng)設(shè)置它。 如果您設(shè)置了 ?Moralis.serverURL?,我們將嘗試提取主機(jī)名并使用 ws://hostname 作為默認(rèn)的 liveQueryServerURL。 但是,如果您想定義自己的 liveQueryServerURL 或使用不同的協(xié)議(例如 wss),則應(yīng)自行設(shè)置。

WebSocket 狀態(tài)

我們公開了三個(gè)事件來幫助您監(jiān)控 WebSocket 連接的狀態(tài):

打開事件

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

當(dāng)我們與 LiveQuery 服務(wù)器建立 WebSocket 連接時(shí),您將收到此事件。

關(guān)閉事件

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

當(dāng)我們失去與 LiveQuery 服務(wù)器的 WebSocket 連接時(shí),您將收到此事件。

錯(cuò)誤事件

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

當(dāng)發(fā)生網(wǎng)絡(luò)錯(cuò)誤或 LiveQuery 服務(wù)器錯(cuò)誤時(shí),您將收到此事件。

重新連接

由于整個(gè) LiveQuery 功能依賴于與 LiveQuery 服務(wù)器的 WebSocket 連接,因此我們總是嘗試保持打開的 WebSocket 連接。

因此,當(dāng)與 LiveQuery 服務(wù)器的連接丟失時(shí),我們會(huì)嘗試自動(dòng)重新連接。 我們在引擎蓋下做指數(shù)回退。

但是,如果 WebSocket 連接由于 ?Moralis.LiveQuery.close()? 或 ?client.close()? 而關(guān)閉,我們將取消自動(dòng)重新連接。

SessionToken

當(dāng)您訂閱 MoralisQuery 時(shí),我們會(huì)將 ?sessionToken ?發(fā)送到 LiveQuery 服務(wù)器。 對于標(biāo)準(zhǔn) API,我們默認(rèn)使用當(dāng)前用戶的 ?sessionToken?。 對于高級 API,您可以在訂閱 MoralisQuery 時(shí)使用任何 ?sessionToken?。 需要注意的重要一點(diǎn)是,當(dāng)您注銷或您使用的 ?sessionToken ?無效時(shí),您應(yīng)該取消訂閱并重新訂閱 MoralisQuery。 否則,您可能會(huì)遇到安全問題,因?yàn)槟鷷?huì)收到不應(yīng)該發(fā)送給您的事件。

使用 Moralis.Query.or 和兩個(gè)查詢的示例

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);
});


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號