对不起,我不知道这是一个问题,还是我无法以正确的方式使用它,
我面临的问题是..
我正在尝试创建具有某些字段的新文档,其中某些字段是创建的,当我尝试使用onSnapshot()侦听器检索新输入的文档时,就会出现问题。 仅在 firebase.firestore.FieldValue的值时,onSnapshot()侦听器就会被触发一次,两次触发的类型为添加,然后触发一次,类型为 modified 。不能同时插入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());
}
});
这是控制台屏幕截图:-
答案 0 :(得分:1)
您看到的是预期的行为。客户端在添加时即会看到自己的文档信息(您的“添加的”回调-这被视为an event for a local change),但是由于时间戳是在服务器上计算的,因此该时间戳会稍后写入服务器,最终同步回客户端(您的“已修改”回调)。链接的文档显示了如何判断快照是否具有未完全提交到服务器上的挂起写入。
检索到的文档具有一个metas.hasPendingWrites属性,该属性可以 指示文档是否具有尚未进行的本地更改 尚未写入后端。您可以使用此属性来确定 快照侦听器收到的事件的来源:
db.collection("cities").doc("SF") .onSnapshot(function(doc) { var source = doc.metadata.hasPendingWrites ? "Local" : "Server"; console.log(source, " data: ", doc.data()); });