Firebase Cloud Functions - Как вызвать другую функцию и вернуть объект - PullRequest
1 голос
/ 25 апреля 2019

Я создал вызываемую функцию из моего углового компонента.Мой угловой компонент вызывает функцию createUser и успешно возвращает значение userRecord.

Однако я хотел бы вызвать еще одну облачную функцию с именем createUserRecord.Я не слишком знаком с обещаниями и тем, что нужно вернуть, где в этом конкретном сценарии.

Ниже приведены две мои облачные функции.Как бы мне позвонить createUserRecord после успеха createUser?

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

Функция углового вызова

Журнал консоли sanitizedMessage вернет неопределенное значение.

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) => {
      // Read result of the Cloud Function.
      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);
    });
  }

1 Ответ

1 голос
/ 25 апреля 2019

Если вы хотите создать запись в Firestore при создании пользователя, вы можете сделать это в уникальной облачной функции.Следующий код поможет, сделав предположение, что вы хотите записать в коллекцию users Firestore.

const FieldValue = require('firebase-admin').firestore.FieldValue;

...
export const createUser = functions.https.onCall((data, context) => {
  console.log('data = ', data);
  return admin
    .auth()
    .createUser({
      email: data.email,
      password: data.password
    })
    .then(userRecord => {
      return admin.firestore().collection('users')
        .doc(userRecord.uid)
        .set({
          email: userRecord.displayName,
          createdAt: FieldValue.serverTimestamp(),
          nickname: 'bubba'
        });
    })
    .then(() => {
      return {
        result: 'Success'
      };
    })
    .catch(error => {
      //Look at the documentation for Callable Cloud Functions to adapt this part:
      //https://firebase.google.com/docs/functions/callable?authuser=0
    });
});

"Есть ли особая причина не связывать функции вКФ?»?

Как объясняется в документации , «Облачные функции могут быть связаны с определенным триггером».Вы можете «связать» облачные функции, создав соответствующие триггеры, например, создав документ в Firestore в одном CF (вызываемая функция, например), который будет запускать другой CF, который отвечает на триггер Firestore). Сказав, что в большинстве случаев вы, вероятно, можете покрыть множество потребностей в уникальной облачной функции, объединяя обещания вместо цепочки облачных функций .

Наконец, я бы не рекомендовалВызовите функцию облака HTTP из функции облака, потому что (IMHO) функции облака HTTP больше предназначены для вызова внешним потребителем (я даже не знаю, сработает ли это).

Было бы интересно узнать мнение Firebasers по этому поводу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...