Firebase云数据库触发器功能并不总是完成

时间:2018-05-30 10:07:31

标签: javascript firebase google-cloud-functions

我有一个数据库触发功能,当团队管理员向其团队添加新成员时触发该功能。该功能应该在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 :(得分:1)

这应该有效:

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

相关问题