Firestore使用2次读取来添加带有时间戳的文档

时间:2019-07-30 16:05:22

标签: javascript firebase google-cloud-firestore

所以我想与Firestore建立一个基本的聊天,并在实现它的同时我注意到侦听器实际上为要添加的1个文档注册了2个事件。

以下是添加文档的代码:

      const chatRef = this.$fireStore.collection('chats/global/messages');

      chatRef.add({
        displayName: 'Prof Dr Barcode',
        content: this.newMsg,
        timestamp: this.$fireStoreObj.FieldValue.serverTimestamp()
      });

我的听众看起来像这样:

const chatRef = this.$fireStore.collection('chats/global/messages');

const initialRef = chatRef.limit(10).orderBy('timestamp');

initialRef.onSnapshot(querySnapshot => {
  querySnapshot.docChanges().forEach(change => {
    console.log(change.type);
    if (change.type === 'added') {
      this.messages.push(change.doc.data());
    }
  });
});

现在change.type控制台日志为每个添加的文档触发两次。一次使用added,一次使用modified,在调查过程中,我看到当我自己将文档记录到侦听器中时,它会被记录两次,首先是added事件,时间戳字段为{ {1}},然后立即用null再次触发,并填充modified字段。

我不认为这是Firestore应该表现的正确方式吗?

1 个答案:

答案 0 :(得分:1)

您正在观察的是预期的行为。这是因为Firestore客户端SDK首先会立即将新文档写入本地缓存,并且会将更改作为“添加的”更改通知所有侦听器。因为您编写了服务器时间戳,所以最终值将在文档同步到服务器(而不是在客户端)后得到解释,从而导致时间戳字段发生更改。该更改将与客户端同步,从而导致客户端上的“已修改”更改。

如果删除服务器时间戳,则不应看到其他修改,因为服务器现在没有内容可添加到客户端不知道的文档中。