firebase.firestore.FieldValue.serverTimestamp () создает «измененную» запись снимка, когда я пытаюсь вставить ее - PullRequest
0 голосов
/ 24 мая 2019

Извините, я не в курсе, является ли это проблемой, или я не могу правильно ее использовать,

Проблема, с которой я сталкиваюсь, это ..

Я пытаюсь создать новый документ с определенными полями, с одним полем , созданным , проблема возникает, когда я пытаюсь получить вновь введенный документ с помощью прослушивателя onSnapshot (). Слушатель onSnapshot () запускается дважды один раз с типом добавленным и сразу после этого с типом , модифицированным , просто потому, что значение firebase.firestore.FieldValue.serverTimestamp ( ) не вставляется одновременно.

Вот фрагмент кода для добавления документа

            senderid : this.buddy.senderId,
            receiverid: this.buddy.receiverId,
            message : msg,
            created: firebase.firestore.FieldValue.serverTimestamp()

А вот код для чтения документов:

   this.db.collection(this.collectionName.friendsCollection).doc(this.buddy.docid)
     .collection(this.collectionName.chatsCollection).orderBy('created')
     .onSnapshot(snapshot=> {
       skip.buddymessages = [];
       if(snapshot.empty)
       {
         console.log("First Chat");
       }
       else{
         console.log("size",snapshot.size)
         snapshot.docChanges.forEach(change => {
           if (change.type === 'added') {
             console.log('New : ', change.doc.data());
           }
           if (change.type === 'modified') {
             console.log('Modified : ', change.doc.data());
           }
           if (change.type === 'removed') {
             console.log('Removed : ', change.doc.data());
           }
         });

Вот скриншот консоли: - Error

1 Ответ

1 голос
/ 24 мая 2019

То, что вы видите, - это ожидаемое поведение.Клиент видит собственную информацию о документе в момент его добавления (ваш «добавленный» обратный вызов - это считается событием для локального изменения ), но, поскольку временная метка вычисляется на сервере, эта временная метка записывается позже.на сервере, и в конечном итоге синхронизируется обратно с клиентом (ваш «измененный» обратный вызов).В связанной документации показано, как определить, есть ли у моментального снимка ожидающая запись, которая не была полностью зафиксирована на сервере.

Полученные документы имеют свойство metadata.hasPendingWrites, которое указывает, есть ли в документе локальные изменения.это еще не было написано к бэкэнду.Это свойство можно использовать для определения источника событий, полученных слушателем снимка:

db.collection("cities").doc("SF")
    .onSnapshot(function(doc) {
        var source = doc.metadata.hasPendingWrites ? "Local" : "Server";
        console.log(source, " data: ", doc.data());
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...