【问题标题】:firebase cloud functions invoke callbackfirebase 云函数调用回调
【发布时间】:2021-09-13 13:56:51
【问题描述】:

我正在使用 firebase admin SDK 为我的网络应用创建新用户。

// function to create user and store additional info in firestore
exports.createUser = functions
    .https.onCall((data, context) => {
      admin.auth().createUser({
        phoneNumber: data.phoneNumber,
        displayName: data.displayName,
      }).then((user) => {
        // store data in firestore
        admin.firestore().collection("user").doc(user.uid).set({...data});
      }).catch((err) => {
        // handle error
      });
    });

当我从客户端调用该函数(将其附加到 onClick 事件)时,我想等到用户成功添加到 firestore 并调用 fetchUser 函数,以便我可以看到新添加的用户的新数据列表。目前 fetchUser 被调用并刷新页面,但在刷新之前我看不到新添加的用户。

const createUser = functions.httpsCallable('createUser');

const createNewUser = () => {
    createUser({
      phoneNumber: "+1111111111111",
      displayName: "test",
      introduction: "testcreate",
    })
  .then((res) => {
    fetchUser(); // fetchUser just fetches user data from firestore and rerenders page 
  })
  .catch((err) => {
    console.log(err);
  });

};

总而言之,我能否知道云功能何时完成其工作并运行特定功能或任务?

【问题讨论】:

    标签: node.js firebase google-cloud-firestore google-cloud-functions firebase-admin


    【解决方案1】:

    正如您将在来自official Firebase video series 的关于“JavaScript Promises”的三个视频中看到的那样,当所有异步操作完成时,您必须在后台触发、Pub/Sub 或 Callable Cloud Function 中返回 Promise 或值。

    这有两个关联的效果:

    1. 当异步操作完成时,它会向 Cloud Function 平台指示它可以终止并清理您的函数。
    2. 相反,在异步操作完成之前,它会向 Cloud Function 平台指示它应该在终止 Cloud Function 之前等待。

    要返回 Promise,由于您链接了多个异步 Firebase Admin SDK 方法(它们返回 Promises),因此您需要返回 Promise chain,如下所示:

    exports.createUser = functions.https.onCall((data, context) => {
        return admin  // <== See return here
        .auth()
        .createUser({
          phoneNumber: data.phoneNumber,
          displayName: data.displayName,
        })
        .then((user) => {
          // store data in firestore
            return admin   // <== See return here
            .firestore()
            .collection('user')
            .doc(user.uid)
            .set({ ...data }); 
        })
        .then(() => {
          // The set() method returns Promise<void>
          // To send data back to the client, return data that can be JSON encoded
          return { result: 'user created' };
        })
        .catch(error => {
          // See https://firebase.google.com/docs/functions/callable#handle_errors
          // on how to handle errors
        });
    });
    

    这样,当您的前端返回 Callable Cloud Function 响应时,您可以确定用户和 Firestore 文档已创建。


    如果要使用async/await 关键字,请执行以下操作。请注意,不建议将then()async/await 混用。

    exports.createUser = functions
        .https.onCall(async (data, context) => {   // <== See async here
    
            try {
                const user = await admin.auth().createUser({
                    phoneNumber: data.phoneNumber,
                    displayName: data.displayName,
                });
    
                await admin.firestore().collection("user").doc(user.uid).set({ ...data });
                return { result: 'user created' }
                
            } catch (error) {
                console.log(error);  // If desired
                // See https://firebase.google.com/docs/functions/callable#handle_errors
                // on how to handle errors
            }
    
        });
    

    看看代码的可读性如何,就好像它是同步代码一样。

    【讨论】:

      【解决方案2】:

      看起来您没有正确返回承诺,因此函数在文档更新之前终止。请尝试添加如下所示的返回语句。

      exports.createUser = functions
          .https.onCall((data, context) => {
            return admin.auth().createUser({
              phoneNumber: data.phoneNumber,
              displayName: data.displayName,
            }).then(async (user) => {
              // store data in firestore
              await admin.firestore().collection("user").doc(user.uid).set({...data});
              return {data: user.uid}
            }).catch((err) => {
              // handle error
              return {error: error}
            });
          });
      

      那么理想情况下,您应该在所有承诺都解决后收到响应(即更新文档)。还要确保您没有启用 Firestore 本地缓存。

      【讨论】:

        猜你喜欢
        • 2019-01-18
        • 2018-05-17
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 2018-10-02
        • 1970-01-01
        • 2020-11-24
        相关资源
        最近更新 更多