当删除某个文档时,我使用firebase触发器函数来删除集合,到目前为止,我的功能运行得很好——当文档被删除时,触发器被激活,我得到了我需要的数据,以获得我想要删除的集合的路径。我使用forEach来浏览所有文档,并将它们放在一个批中删除,然后提交该批。
第一次触发此功能时,它工作得很好,文档被删除。我得到了一个集合的路径,然后所有文档都被放入批量删除,然后提交
不过,在那之后,我遇到的问题是,如果第二次删除另一个文档,我会获得集合的路径,然后在fourEach语句中,它只在集合中循环一次,然后转到catch块。
我不明白是怎么回事,为什么它不起作用。我已经尝试过多次了,但我得到了相同的错误
我对批量删除和提交进行了评论,并尝试了下面的代码行,每次调用该函数时都能很好地工作,集合中的所有文档都被删除了,所以我知道这与我如何实现批处理有关,但我不知道出了什么问题
//db.collection(`messages/${currentuid}/${contex.documentId}`).doc(document.id).delete()
我的完整代码是
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
const db = admin.firestore();
const batch = db.batch();
//triggers when a document is deleted
exports.onDeletCollections = functions.firestore.document('recentMsg/{currentuid}/{touid}/{documentId}').onDelete(async(snap, context) => {
const data = snap.data();
//extract the users uid from the document that was deleted
const currentuid = data['fromuid']
const contex = context.params;
await db.collection(`messages/${currentuid}/${contex.documentId}`).get()
.then(snapshot => {
snapshot.forEach(document => {
if (snapshot.size === 0) {
console.log(` The snapshot size Should be zero if the if block works ${snapshot.size}`)
return
}
// below line works fine every time it's called but not batch
//db.collection(`messages/${currentuid}/${contex.documentId}`).doc(document.id).delete()
batch.delete(db.collection(`messages/${uid}/${contex.documentId}`).doc(document.id))
});
batch.commit()
})
.then(
console.log(`Do whatever you wish after the batch has been committed`)
)
.catch(error => {
console.log(` This is being printed from the catch block `)
});
});
这是我使用Firebase功能的第一周,我在这方面很新,所以任何帮助都将不胜感激
当所有异步作业完成时,您需要返回一个Promise。有关这一关键点的更多详细信息,请参阅本文档。此外,最好不要混淆then()
和async/await
。
因此,以下内容应该起作用:
exports.onDeletCollections = functions.firestore.document('recentMsg/{currentuid}/{touid}/{documentId}').onDelete(async (snap, context) => {
const currentuid = snap.get('fromuid');
const context = context.params;
const snapshot = await db.collection(`messages/${currentuid}/${context.documentId}`).get();
if (snapshot.size === 0) {
console.log(` The snapshot size Should be zero if the if block works ${snapshot.size}`)
return null;
} else {
const batch = db.batch();
snapshot.forEach(document => {
batch.delete(db.collection(`messages/${uid}/${context.documentId}`).doc(document.id))
});
return batch.commit(); // See the return here!!
}
});