Вы правы serverTimestamp()
именно для того, чтобы получить метку времени на сервере и не полагаться на локальные часы пользователей.Стоит отметить, что отправка сообщения и получение метки времени от локальных часов пользователей будут нормальными, поскольку метка времени сообщения не очень чувствительна ко времени.Конечно, вы хотели бы знать, когда сообщение отправлено, но если это в течение 1-2 секунд, это не проблема в большинстве случаев.
Если вы выполняете запрос на стороне клиента, ваш запрос не должен основываться на времени сервера, он должен основываться на стороне клиента.Так как это клиентский запрос, а не серверный запрос.
Вот клиентский запрос, который вам нужен.
const currentTime = new Date();
const query = firebase.firestore()
.collection('messages')
.where('owner','==',userID)
.where('showtime','<',currentTime)
.orderBy('showtime', 'desc')
.limit(25);
Этот запрос получит 25 сообщений с 'showtime' после текущеговремя на клиенте.
Теперь, если сообщения должны быть чрезвычайно чувствительными ко времени, и вам действительно нужны сообщения, основанные на отметке времени сервера, я рекомендую вместо выполнения запроса на клиенте, как описано выше, настроитьоблачная функция api.Взгляните на документы Firebase для непосредственного вызова облачных функций, если у вас их раньше не было.
Вот как вы хотели бы, чтобы ваша облачная функция выглядела следующим образом:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp()
exports.getUserMessages = functions.https.onCall((data, context) => {
const uid = context.auth.uid;
const firestore = admin.firestore();
firestore.collection('messages')
.where('owner', '==', uid)
.where('showtime', '<', new Date())
.orderBy('showtime', 'desc')
.limit(25)
.get()
.then(snapshot => {
return snapshot;
});
});
Это дастсообщения, основанные на отметке времени сервера.Стоит отметить, что если вам не нужно быть очень чувствительным ко времени, это не очень хорошая идея.Поскольку этот вызов должен делать дополнительный ненужный вызов каждый раз, когда вы звоните.Потому что вы делаете вызов функции облака, а затем делаете запрос к базе данных firestore.Я бы порекомендовал вместо того, чтобы делать это на основе времени сервера, делать это на основе отметки времени клиента.В 99 раз из 100 разница во времени между клиентом и сервером не стоит дополнительных двойных вызовов, которые вы делаете, особенно когда вы думаете о масштабировании всего, когда набираете больше пользователей.
Надеюсь, что ответили на ваш вопрос :)