firebase 所有文档的通用Firestore触发器

bzzcjhmw  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(158)

如何在Firestore中的任何集合中触发任何文档更改的函数?我想管理createdAtupdatedAt时间戳。我有很多集合,不想为每个集合单独注册触发器。在这一点上,我还不如为addsetupdate创建 Package 函数。
如何注册一个在任何文档被修改时触发的回调?
编辑:
在这个时候(2019-08-22),我决定只创建一个 Package 器函数来实现这个功能。公认的答案是不维护无模式性。基于这篇文章,我创建了这个upset函数,它管理时间戳并避免“文档不存在”错误:

const { firestore: { FieldValue } } = require('firebase-admin')

module.exports = async function upset (doc, data = {}) {
  const time = FieldValue.serverTimestamp()

  const update = { updatedAt: time }
  const updated = { ...data, ...update }

  try {
    const snapshot = await doc.get()

    if (snapshot.exists) {
      return doc.update(updated)
    } else {
      const create = { createdAt: time }
      const created = { ...updated, ...create }

      return doc.set(created)
    }
  } catch (error) {
    throw error
  }
}
4c8rllxm

4c8rllxm1#

如文档中所述,您可以在文档路径中使用通配符。更具体地说,“您可以定义任意数量的通配符来替换显式集合或文档ID”
因此,以下云函数将适用于根集合下的文档:

exports.universalFirestoreTrigger = functions.firestore
    .document('{collecId}/{docId}')
    .onWrite((snap, context) => {

        console.log("Collection: " + context.params.collecId);
        console.log("Document: " + context.params.docId);

        return null;

    });

如果您有子集合,则需要编写另一个Cloud Function,如下所示:

exports.universalFirestoreTriggerSubCollections = functions.firestore
    .document('{collecId}/{docId}/{subCollecId}/{subDocId}')
    .onWrite((snap, context) => {

        console.log("Collection: " + context.params.collecId);
        console.log("Document: " + context.params.docId);
        console.log("Sub-Collection: " + context.params.subCollecId);
        console.log("Sub-Collection Document: " + context.params.subDocId);

        return null;

    });

如果你有一个子集合的话……

相关问题