firestorecloud函数更新另一个文档



我想增加"votes"字段的值在一个文档(item_id)中的集合项。我想让一个云函数在每次向集合投票中添加新文档时为我执行此操作。新文档包含item_id。有人知道我该怎么做吗?这是我现在的代码:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();
export const vote = functions.firestore.document("/Votes/{vote}")
.onCreate((snapshot, context) => {
const item = context.params.item_id; 
const itemdoc = admin.firestore().collection("items").doc(item);
itemdoc.get().then((doc) => {
if (doc.exists) {
itemdoc.update({
"votes": admin.firestore.FieldValue.increment(1)})
.catch((err) => {
console.log("Error updating item vote", err);  
});
}
});
});

在firebase控制台日志中,路径必须是一个非空字符串。有人知道我哪里做错了吗?因为路径不应该是空的

可以这样做:

export const vote = functions.firestore.document("/Votes/{vote}")
.onCreate((snapshot, context) => {
const item = snapshot.data().item_id;
const itemDocRef = admin.firestore().collection("items").doc(item);

return itemDocRef.update({
"votes": admin.firestore.FieldValue.increment(1)
});
});

您需要在snapshot上使用data()方法,以便获得新文档的JavaScript表示。然后取item_id属性

另一种可能性是使用get()方法,如下:

const item = snapshot.get("item_id");

我建议将itemdoc变量重命名为itemDocRef,因为它是DocumentReference


根据您的评论更新:

如果您想在更新后读取项目Doc,您应该执行以下操作:

export const vote = functions.firestore.document("/Votes/{vote}")
.onCreate(async (snapshot, context) => {
const item = snapshot.data().item_id;
const itemDocRef = admin.firestore().collection("items").doc(item);
await itemDocRef.update({"votes": admin.firestore.FieldValue.increment(1)});
const itemDocSnapshot = await itemDocRef.get();
//Do whatever you want with the Snapshot
console.log(itemDocSnapshot.get("user_id"));

// For example update another doc
const anotherDocRef = admin.firestore().collection("....").doc("....");
await anotherDocRef.update({"user_id": itemDocSnapshot.get("user_id")});

return null;
});

注意asyncawait关键字的使用。

const item = context.params.item_id; 

通过访问context.params,您试图找到.document("/Votes/{vote}")中存在的通配符值,该值肯定是未定义的。要从文档中读取字段,请执行以下命令:

const {item_id} = snapshot.data()
// Getting item_id using Object destructuring
if (!item_id) {
// item_id is missing in document
return null 
}
const itemdoc = admin.firestore().collection("items").doc(item_id);
// Pass item_id in doc                                    ^^^^^^^

您可以在文档中阅读更多关于onCreate的信息。第一个参数snapshot是包含文档数据的QueryDocumentSnapshot,第二个参数context是EventContext。

相关内容

最新更新