我正在使用Firebase Realtime DB實施一個聊天。有一個要求,即一些聊天室可以默認顯示新的訊息,但不同聊天室的訊息在顯示之前必須首先得到批準。
Firebase中的DB結構是這樣嵌套的:
/chat/$roomID/$messageID/
而每個訊息物件的結構如下:
{
user: string
content: string
isApproved: boolean
clientStamp: number //客戶端unix時間戳。
serverStamp: number //server-side unix timestamp, via `firebase.database.ServerValue.TIMESTAMP`。
}
只顯示默認的聊天室是很容易的--我會按照serverStamp來排列資料:
let query = DBConn.ref('chat/'/span> roomID)。 orderByChild('serverStamp').limitTolast(50)
query.on("value", snapshot => {
//設定要顯示的資訊串列。
this.appendSnapshot(快照)。
});
然而,"批準優先 "規則使這種方法變得困難。明顯的解決方案是只顯示屬性isApproved設定為true的訊息。但是,如果我查詢最后N條按時間戳排序的訊息,而有人發布了N條未批準的訊息,那么這就會把任何已批準的訊息從查詢結果中剔除,聊天記錄就會變成空的。Realtime DB有以下限制,這使得它無法同時按時間戳和isApproved進行查詢:
你一次只能使用一個order-by方法。
因此,現在我正在用以下方式解決這個問題:
clientStamp(客戶端unix時間戳)而不是serverStampclientStamp的值除以2,這意味著這些新的訊息將永遠不會從查詢結果中取代已經批準的舊訊息(因為他們的時間戳有更高的值)clientStamp的值被設定為firebase.database.ServerValue.TIMESTAMP的值(服務器端時間),這將它推到聊天查詢的頂部(orderByChild('serverStamp'))......但這是一個相當快速的解決方法。有什么方法可以讓這個方法在默認顯示和批準優先的聊天室中都能很好地作業嗎?
uj5u.com熱心網友回復:
我喜歡你將時間戳設定為審批流程的一部分的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325770.html
標籤:
上一篇:為什么我的方法會在串列中創建一個額外的串列?Leetcode3Sum問題
下一篇:撲朔迷離。NoSuchMethodError。方法'[]'被呼叫在null上。接收者:null試著呼叫。[]("User")
