所以我想与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应该表现的正确方式吗?
答案 0 :(得分:1)
您正在观察的是预期的行为。这是因为Firestore客户端SDK首先会立即将新文档写入本地缓存,并且会将更改作为“添加的”更改通知所有侦听器。因为您编写了服务器时间戳,所以最终值将在文档同步到服务器(而不是在客户端)后得到解释,从而导致时间戳字段发生更改。该更改将与客户端同步,从而导致客户端上的“已修改”更改。
如果删除服务器时间戳,则不应看到其他修改,因为服务器现在没有内容可添加到客户端不知道的文档中。