为什么在文档删除后docChange被调用两次?

时间:2019-07-04 12:38:06

标签: node.js google-cloud-firestore

我在消防站里有个收藏品。我正在侦听节点后端的更改。现在,当我收到更改时,便会处理数据并删除与更改关联的Firestore文档。当我调用delete时,我再次在侦听器中获得了相同的更改,并且最终再次处理了数据。

我在互联网上搜索,找不到解决该问题的方法。

let doc_form_reponse = db.collection(CONSTANTS.FIREBASE.COLLECTIONS.SUBMISSIONS);
let qref1 = doc_form_reponse.where('context', '==', 'someContext').where('processed', '==', false);
let observer_form_response = qref1.onSnapshot(docSnapshot => {
    docSnapshot.docChanges().forEach(docChange => {
        let doc = docChange.doc;
        // save data to Mongo Db
        var survey = Surveyresponse({
            resp: docChange.doc.data().response,
            metadata: JSON.stringify(docChange.doc.data().metadata)
        });

        survey.save(function (err, resp) {
            if (err) return console.error(err)
            else {
                console.log(doc.id," deleted from firebase");
                doc.ref.delete();
            }

        })
    })
    // ...
}, err => {
    console.log(`Encountered error: ${err}`);
});

在调用doc.ref.delete()之后,一旦收到更改并再次获得数据库条目。

1 个答案:

答案 0 :(得分:1)

每次在查询结果集更改时,都会触发Cloud Firestore中查询的侦听器。因此,如果删除从查询中获得的文档,则监听器将再次触发以反映该更改。这是正常行为,无法解决。如果您不想处理结果集中的删除操作,则必须在侦听器as described in the documentation中检查文档更改的类型。您的docChange具有类型参数,该参数指示更改与以前的快照有何不同。