Проверьте, существует ли пользователь Firebase без выдачи ошибки - PullRequest
0 голосов
/ 03 мая 2018

У меня есть веб-сайт, который предлагает простой сервис обмена сообщениями. Частные лица могут заплатить за услугу, или бизнес может заплатить за ежемесячную подписку и затем добавить своих клиентов / пользователей бесплатно. Когда компания добавляет электронную почту клиента / пользователя, запускается следующая функция. Я использую функции Firebase и createUser для создания пользователя на моем сервере (меньше). Однако иногда предприятие пытается зарегистрировать пользователя, и этот пользователь уже существует. В этом случае я хочу отправить пользователю электронное письмо с напоминанием.

Код, который у меня работает, отлично работает, но он кажется странным, когда в цепочке уловов / ошибок есть цепочка. Есть ли другой способ обнаружить, если электронное письмо уже зарегистрировано в учетной записи Firebase и не выдает ошибку?

exports.newUserRegisteredByBusiness = functions.database.ref('users/{uid}/users/invited/{shortEmail}').onWrite( (data, context) => {

//don't run function if data is null
if (!data.after.val()){
  console.log('SKIP: newUserRegisteredByBusiness null so skipping')
  return null
} else {

  let businessUID = context.params.uid
  let email = data.after.val()
  let shortEmail = context.params.shortEmail
  let password // =  something I randomly generate

  return admin.auth().createUser({ email: email, password: password}).then( (user)=> {

      //write new user data
      let updates = {}
      let userData // = stuff I need for service to run
      updates['users/' + user.uid ] = userData;
      return admin.database().ref().update(updates)
    }).then( () =>{

      //email new user about their new account
      return emailFunctions.newUserRegisteredByBusiness(email, password)

    }).catch( (error) =>{
      //if user already exist we will get error here.
      if (error.code === 'auth/email-already-exists'){
         //email and remind user about account
        return emailFunctions.remindUsersAccountWasCreated(email).then( ()=> {
          //Once email sends, delete the rtbd invite value that triggered this whole function
          //THIS IS WHERE MY CODE FEELS FUNKY! Is it ok to have this chain?
          return admin.database().ref('users/' + businessUID + '/users/invited/' + shortEmail).set(null)
        })
      } else {

        //delete the rtbd value that triggered this whole function
        return admin.database().ref('users/' + businessUID + '/users/invited/' + shortEmail).set(null)

      }


    });

  }
})

1 Ответ

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

Чтобы узнать, была ли учетная запись пользователя уже создана для данного адреса электронной почты, вы набираете admin.auth().getUserByEmail.

admin.auth().getUserByEmail(email).then(user => { 
  // User already exists
}).catch(err => { 
  if (err.code === 'auth/user-not-found') {
    // User doesn't exist yet, create it...
  }
})

Хотя вы все еще используете catch(), вы чувствуете себя намного менее неудачно.

...