Функции запуска базы данных Firebase Cloud не всегда выполняются - PullRequest
0 голосов
/ 30 мая 2018

У меня есть функция, запускаемая базой данных, которая срабатывает, когда администратор группы добавляет новых членов в свою команду.Предполагается, что функция создаст аутентификацию в Firebase и объект, где новый пользователь может хранить свои личные настройки.Моя проблема в том, что когда одновременно добавляется много членов с помощью функции импорта, моя функция не всегда завершается.Так как они, кажется, срабатывают нормально, когда я просматриваю журнал, я подозреваю, что моя реализация цепочечных обещаний является причиной ошибки.Вот копия кода.Пожалуйста, помогите мне исправить ошибки.

// When a team adds a new member, we should also create authentication and a record for his user data...
exports.createNewUserAndAuthOnNewMember = functions
  .database
  .ref('/Members/{team}/{memberId}/createNewUser')
  .onCreate(event => {

  const memberRef = admin.database().ref('/Members/'+event.params.team+'/'+event.params.memberId);

  memberRef.once('value')
  .then((memberSnap) => {
    const memberEmail = memberSnap.child('email').val();
    const preferredLanguage = memberSnap.child('preferredLanguage').val();

    // Creating authentication for new system user...
    //since we want to update the /user object later on even if the authentication creation fails (because user already exists), this promise is inside the top promise chain
    admin.auth().createUser({
      uid: event.params.memberId,
      email: memberEmail,
      emailVerified: false,
      password: '[random password generated]',
      disabled: false
    })
    .then(function(userRecord) {
      console.log("Successfully created new user:", userRecord.uid);
      return preferredLanguage;
    })
    .catch(function(error) {
      console.log("Error creating new user:", error);
      return preferredLanguage;
    });

  })
  .then(preferredLanguage => {
    // Creating the personal user object in the database
    admin.database().ref('/users/'+event.params.memberId).update({'team': event.params.team, 'preferredLanguage': preferredLanguage});
  })
  .then(() => {
    //we did the job and should remove the trigger from the member object in the database
    memberRef.child('createNewUser').remove();
  })
  .then(() => {
    console.log('Created /users/'+event.params.memberId);
    return true;    
  });
});

1 Ответ

0 голосов
/ 30 мая 2018

Это должно работать:

exports.createNewUserAndAuthOnNewMember = functions
    .database
    .ref('/Members/{team}/{memberId}/createNewUser')
    .onCreate(event => {

        let preferredLanguage;

        const memberRef = admin.database().ref('/Members/' + event.params.team + '/' + event.params.memberId);

        return memberRef.once('value')
            .then((memberSnap) => {
                const memberEmail = memberSnap.child('email').val();
                preferredLanguage = memberSnap.child('preferredLanguage').val();

                // Creating authentication for new system user...
                //since we want to update the /user object later on even if the authentication creation fails (because user already exists), this promise is inside the top promise chain
                return admin.auth().createUser({
                    uid: event.params.memberId,
                    email: memberEmail,
                    emailVerified: false,
                    password: '[random password generated]',
                    disabled: false
                })
            })
            .then(() => {
                // Creating the personal user object in the database
                return admin.database().ref('/users/' + event.params.memberId).update({'team': event.params.team, 'preferredLanguage': preferredLanguage});
            })
            .then(() => {
                //we did the job and should remove the trigger from the member object in the database
                return memberRef.child('createNewUser').remove();
            })
            .catch(error => {
                console.log(error);
                //...
            });
    });

Вы должны возвращать обещание в каждом then() при их объединении, и вам нужен только один улов в конце цепочки.


Кроме того, обратите внимание, что вы используете «старый» синтаксис для облачных функций.Начиная с версии 1.0. + Появился новый синтаксис, см. https://firebase.google.com/docs/functions/beta-v1-diff

...