javascript - 当我尝试插入它时,firebase.firestore.FieldValue.serverTimestamp() 创建了一个 "modified"快照条目

标签 javascript firebase ionic-framework google-cloud-firestore

抱歉,我不知道这是一个问题,还是我无法以正确的方式使用它,

我面临的问题是..

我正在尝试创建一个包含某些字段的新文档,并且创建了一个字段,当我尝试使用 onSnapshot() 监听器检索新输入的文档时,就会出现问题。 onSnapshot() 监听器会被触发两次,类型为 added ,紧接着类型为 modified ,只是因为 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

最佳答案

您所看到的是预期的行为。客户端在添加时会看到自己的文档信息(您的“添加”回调 - 这被视为 an event for a local change ),但由于时间戳是在服务器上计算的,因此该时间戳稍后会写入服务器上,并最终同步回来发送给客户端(您的“修改后”回调)。链接的文档显示了如何判断快照是否有尚未在服务器上完全提交的待处理写入。

Retrieved documents have a metadata.hasPendingWrites property that indicates whether the document has local changes that haven't been written to the backend yet. You can use this property to determine the source of events received by your snapshot listener:

db.collection("cities").doc("SF")
    .onSnapshot(function(doc) {
        var source = doc.metadata.hasPendingWrites ? "Local" : "Server";
        console.log(source, " data: ", doc.data());
    });

关于javascript - 当我尝试插入它时,firebase.firestore.FieldValue.serverTimestamp() 创建了一个 "modified"快照条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56292000/

相关文章:

javascript - 为什么这个表达式总是错误的?

javascript - angularJS 文档中的各种术语是什么意思?

javascript - 使基于 Canvas 滚动的图像序列动画更加流畅

swift - Firebase 时间戳

CSS:如何让文本占据一个容器的 100% 并尊重另一个容器的高度?

javascript - 插槽上下文未获取

ios - firebase queryendingatValue ("") 总是返回数据库中的第一个 child

java - 为什么firebase的addValueEventListener的onDataChange方法中的ArrayList不为null,但外面却为null?

angular - 如何使用 Ionic Contact 显示联系人图片

ionic-framework - ionic 3 : Gradient background