You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 });
  }
);

关键改动说明

  1. 获取正确的文档引用:通过event.data拿到文档快照,再用snap.ref获取可执行更新的DocumentReference
  2. 使用merge选项:docRef.set(data, { merge: true })仅更新指定字段,避免覆盖文档中其他未修改的数据;若只需更新部分字段,也可使用docRef.update(data)
  3. 添加await:所有异步更新操作需加await,确保操作完成后再执行后续逻辑

内容的提问来源于stack exchange,提问作者whatwhatwhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:32:07