Firebase Gen2 onDocumentCreated触发器如何更新刚创建的文档?
解决Firestore onDocumentCreated触发器更新文档的问题
问题根源
你当前的错误是对Firebase触发器参数类型理解有误:
documentData = document.data.data()获取的是文档的纯数据对象,它既没有ref属性,也没有set/update方法document = event赋值错误,event是触发器事件对象,文档快照需从event.data获取
正确实现方式
要更新刚创建的文档,需获取文档的DocumentReference,它存在于event.data.ref中。以下是修正后的代码:
exports.onFriendAdded = onDocumentCreated( "users/{userDocID}/friends/{friendDocID}", async (event: any) => { const timestamp = getTimestamp(); const snap = event.data; // 获取文档快照 const docRef = snap.ref; // 获取文档引用(用于执行更新操作) const documentData = snap.data(); // 获取文档纯数据 const moveOnToNextStep = documentData.moveOnToNextStep; let friendUID = documentData.uid; if (!moveOnToNextStep) { return; } console.log(myAppTag + " onFriendAdded started!"); // 若好友UID为空/空值,更新它 if (friendUID == "" || friendUID == null) { console.log(myAppTag + " 1"); const friendUsername = documentData.username; const friendInfo = await getUserInfo(1, friendUsername, "uid"); console.log(myAppTag + " 2"); if (friendInfo[0] == 1) { friendUID = friendInfo[2]; console.log(myAppTag + " 3"); // 若sendFriendRequest为true,给好友发送通知 // 在这里处理是因为更新friendUID会触发onUpdate,避免重复发送请求 const sendFriendRequest = documentData.sendFriendRequest; if (sendFriendRequest) { console.log(myAppTag + " 4"); const uid = event.params.userDocID; let username = ""; const friendStatus = await getFriendStatus(uid, friendUID); console.log(myAppTag + " 5"); if (friendStatus["returnVal"] == 0) { console.log(myAppTag + " 6"); console.log( myAppTag + " onFriendUpdated getFriendStatus returnVal is 0. Error: " + friendStatus["returnMsg"] ); // 使用docRef执行更新,merge: true避免覆盖其他字段 await docRef.set({ sendFriendRequest: false, modifiedDate: timestamp, }, { merge: true }); return; } if (friendStatus["status"] == "0") { console.log(myAppTag + " 7"); console.log( myAppTag + `onFriendUpdated getFriendStatus user B has blocked user A. status: ` + friendStatus["status"] ); await docRef.set({ sendFriendRequest: false, modifiedDate: timestamp, }, { merge: true }); return; } const userInfo = await getUserInfo(0, uid, "username"); console.log(myAppTag + " 8"); if (userInfo[0] == 1) { username = userInfo[2]; } if (username == "" || username == null) { console.log( myAppTag + " onFriendAdded Error when getting user info: " + userInfo[1] ); return; } console.log(myAppTag + " 9"); const notifResult = await sendNotification( uid, username, friendUID, friendUsername, notifIDFriendRequest ); console.log(myAppTag + " 10"); if (notifResult[0] == 1) { console.log(myAppTag + " 11"); await docRef.set({ sendFriendRequest: false, modifiedDate: timestamp, }, { merge: true }); console.log(myAppTag + " 11.1"); } else { console.log(myAppTag + " 12"); console.error( myAppTag + " onFriendAdded Error when sending the notification." + " uid: " + uid + " username: " + username + " friendUID: " + friendUID + " friendUsername: " + friendUsername + " returnVal: " + notifResult[0] + " returnMsg: " + notifResult[1] ); } } console.log(myAppTag + " 12.1"); await docRef.set({ uid: friendUID, modifiedDate: timestamp, }, { merge: true }); console.log(myAppTag + " 13"); } else { console.log( myAppTag + " onFriendAdded Error when getting friend info: " + friendInfo[1] ); return; } } console.log(myAppTag + " 14"); await docRef.set({ moveOnToNextStep: false, modifiedDate: timestamp, }, { merge: true }); } );
关键改动说明
- 获取正确的文档引用:通过
event.data拿到文档快照,再用snap.ref获取可执行更新的DocumentReference - 使用merge选项:
docRef.set(data, { merge: true })仅更新指定字段,避免覆盖文档中其他未修改的数据;若只需更新部分字段,也可使用docRef.update(data) - 添加await:所有异步更新操作需加
await,确保操作完成后再执行后续逻辑
内容的提问来源于stack exchange,提问作者whatwhatwhat
相关产品推荐
相关产品推荐

