微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

firebase 云函数调用回调

如何解决firebase 云函数调用回调

我正在使用 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);
  });

};

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

解决方法

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

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 本地缓存。

,

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

这有两个相互关联的效果:

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

要返回 Promise,由于您链接了多个异步 Firebase Admin SDK 方法(返回 Promise),您需要按如下方式返回 Promise chain

exports.createUser = functions.https.onCall((data,context) => {
    return admin  // <== See return here
    .auth()
    .createUser({
      phoneNumber: data.phoneNumber,})
    .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,});

            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
        }

    });

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?