Firebase Cloud Functions - 如何调用另一个函数并返回对象

13 浏览
0 Comments

Firebase Cloud Functions - 如何调用另一个函数并返回对象

我从我的Angular组件中创建了一个可调用函数。我的Angular组件调用了createUser函数,并成功返回了userRecord的值。

然而,我想做的是在createUser成功后调用另一个名为createUserRecord的云函数。对于这个特定的情况,我对promise不是特别熟悉,以及在哪里需要返回什么。

下面是我的两个云函数。在createUser成功后,我该如何调用createUserRecord

export const createUser = functions.https.onCall(async (data, context) => {
    console.log('data = ', data);
    return admin.auth().createUser({
        email: data.email,
        password: data.password,
    }).then(function (userRecord) {
        return userRecord
    })
        .catch(function (error) {
            return error;
            console.log('Error creating new user:', error);
        });
});
export const createUserRecord = functions.auth.user().onCreate((user, context) => {
    const userRef = db.doc(`users/${user.uid}`);
    return userRef.set({
        email: user.displayName,
        createdAt: context.timestamp,
        nickname: 'bubba',
    })
});

更新

这是我合并了两个函数的版本。这确实产生了预期的结果,即创建一个账户,然后写入到firestore。然而,由于它没有向客户端返回一个值,所以感觉有点“不对劲”。

export const createUser = functions.https.onCall(async (data, context) => {
    console.log('data = ', data);
    return admin.auth().createUser({
        email: data.email,
        password: data.password,
    }).then(function (userRecord) {
        const userRef = db.doc(`users/${userRecord.uid}`);
        return userRef.set({
            email: data.email,
            name: data.name,
        })
    })
        .catch(function (error) {
            return error;
            console.log('Error creating new user:', error);
        });
});

Angular可调用函数

sanitizedMessage的控制台日志将返回undefined。

addUser() {
    const createUser = firebase.functions().httpsCallable('createUser');
    const uniquePassword = this.afs.createId();
    createUser({
      email: this.userForm.value.email,
      password: uniquePassword,
      name: this.userForm.value.name,
    }).then((result) => {
      // 读取云函数的结果。
      var sanitizedMessage = result.data.text;
      console.log('sanitizedMessage = ', sanitizedMessage);
    }).catch((error) => {
      var code = error.code;
      var message = error.message;
      var details = error.details;
      console.log('error = ', error);
    });
  }

0