firebase - 如何为每个集合插入添加时间戳,在 Cloud Functions 中更新 Firestore 数据库

标签 firebase firebase-realtime-database google-cloud-firestore google-cloud-functions angularfire2

我有一个名为 Posts 的 firestore 集合
我在客户端做了一个插入,它工作正常。

我想使用 firebase 函数将 createdAt 和 updatedAt 字段添加到我的帖子集合 firestore 中的每个插入中。

最佳答案

21 年 1 月 31 日更新 - 虽然我相信我的包是很棒的代码并回答了这个问题,但有一种更便宜的方法:消防规则 :

allow create: if request.time == request.resource.data.createdAt;
allow update: if request.time == request.resource.data.updatedAt;
如果更新于 createdAt 没有在前端添加正确的日期和时间,它将不允许更新/创建。这要便宜得多,因为它不需要数据函数,也不需要每次更新内容时进行额外写入。
不要使用常规日期字段,请务必通过以下方式在前端添加时间戳:
firebase.firestore.FieldValue.serverTimestamp;

更新 11/24/20 - 我实际上把下面的函数放在我的 npm 包中 adv-firestore-functions :
见我的博文:https://fireblog.io/blog/post/automatic-firestore-timestamps

我创建了一个通用的云函数来使用 createdAt 和 updatedAt 时间戳更新您想要的任何文档:
exports.myFunction = functions.firestore
    .document('{colId}/{docId}')
    .onWrite(async (change, context) => {

        // the collections you want to trigger
        const setCols = ['posts', 'reviews','comments'];

        // if not one of the set columns
        if (setCols.indexOf(context.params.colId) === -1) {
            return null;
        }

        // simplify event types
        const createDoc = change.after.exists && !change.before.exists;
        const updateDoc = change.before.exists && change.after.exists;
        const deleteDoc = change.before.exists && !change.after.exists;

        if (deleteDoc) {
            return null;
        }
        // simplify input data
        const after: any = change.after.exists ? change.after.data() : null;
        const before: any = change.before.exists ? change.before.data() : null;

        // prevent update loops from triggers
        const canUpdate = () => {
            // if update trigger
            if (before.updatedAt && after.updatedAt) {
                if (after.updatedAt._seconds !== before.updatedAt._seconds) {
                    return false;
                }
            }
            // if create trigger
            if (!before.createdAt && after.createdAt) {
                return false;
            }
            return true;
        }

        // add createdAt
        if (createDoc) {
            return change.after.ref.set({
                createdAt: admin.firestore.FieldValue.serverTimestamp()
            }, { merge: true })
                .catch((e: any) => {
                    console.log(e);
                    return false;
                });
        }
        // add updatedAt
        if (updateDoc && canUpdate()) {
            return change.after.ref.set({
                updatedAt: admin.firestore.FieldValue.serverTimestamp()
            }, { merge: true })
                .catch((e: any) => {
                    console.log(e);
                    return false;
                });
        }
        return null;
    });


关于firebase - 如何为每个集合插入添加时间戳,在 Cloud Functions 中更新 Firestore 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52660962/

相关文章:

angularjs - 在 Firebase 中增加所有值的最有效方法

android - 无法将列表检索到 Firebase 数据库中

Android - Firestore/Firebase 实时数据库 ".info/connected"返回错误的连接状态

firebase - 更改了Firebase项目,它给了我错误[API key 无效。请传递有效的API key 。身份验证期间

google-cloud-firestore - 被取代的 Cloud Datastore 上的 "DatastoreException: Missing or insufficient permissions"

google-cloud-firestore - 通过自定义对象字段查询 Google Firestore 数据库

javascript - 获取 firebase 返回的数组的长度

android - 如何更改firebase中的电子邮件验证邮件的内容?

javascript - 使用 React JS 在 Firebase v9 中创建文档时保存文档 ID

ios - Objective-C - Firebase 从数据库检索数据并填充到表中