gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:56:13 26 4
gpt4 key购买 nike

我有一个名为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com