Firebase Cloud Functions - 如何在多个 .then() 方法中使用相同的 return 值

Firebase Cloud Functions - How to use same return value in multiple .then() methods

我正在尝试使用 Firebase Admin SDK 编写一个执行以下操作的 Firebase 云函数:

  1. 使用 email/password 创建用户。
  2. 创建一个 Firestore 文档,引用新创建的 UID。
  3. Returns 如果 1 和 2 成功,则向客户端发送 Firebase JWT 令牌。

我目前的代码如下:

exports.createUser = functions.https.onCall((data, context) => {
    return admin
      .auth()
      .createUser({
        email: data.email,
        password: data.password,
        phoneNumber: data.number,
      })
      .then((user) => {
        return admin
          .firestore()
          .collection("collectionName")
          .doc(user.uid)
          .set({});
      })
      .catch((error) => {
        console.log("Error creating new user:", error);
      });
  });

我正在努力解决的是链中的下一个 .then(),到 return JWT 令牌。我知道 return JWT 的实际 Admin SDK 代码,但我不确定如何在多个 .then() 中访问新用户的属性,同时还 returning一个承诺(我认为这是正确终止功能所必需的?)

如何添加另一个可以访问 user.uid.then() 并确保函数实例不会过早终止?

您可以简单地使用如下所示的变量:

exports.createUser = functions.https.onCall((data, context) => {

    let userObject;

    return admin
      .auth()
      .createUser({
        email: data.email,
        password: data.password,
        phoneNumber: data.number,
      })
      .then((user) => {
        userObject = user
        return admin
          .firestore()
          .collection("collectionName")
          .doc(user.uid)
          .set({});
      })
      .then(() => {
        const user = userObject;
        // Do whathever you want with user
        await function(user)
        
        // Don't forget to return data that can be JSON encoded, see the doc: https://firebase.google.com/docs/functions/callable#sending_back_the_result
        // In your case the JWT Object I guess
        return ...
      })
      .catch((error) => {
        console.log("Error creating new user:", error);
        // See the doc: https://firebase.google.com/docs/functions/callable#handle_errors
      });
  });

如果你使用 async/await 就更简单了:

exports.createUser = functions.https.onCall(async (data, context) => {

    const user = await admin
      .auth()
      .createUser({
        email: data.email,
        password: data.password,
        phoneNumber: data.number,
      });

    await admin
          .firestore()
          .collection("collectionName")
          .doc(user.uid)
          .set({}); 

    // Do whathever you want with user
    await function(user)

    return ...

  });