У меня есть веб-сайт, который предлагает простой сервис обмена сообщениями. Частные лица могут заплатить за услугу, или бизнес может заплатить за ежемесячную подписку и затем добавить своих клиентов / пользователей бесплатно. Когда компания добавляет электронную почту клиента / пользователя, запускается следующая функция. Я использую функции 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)
}
});
}
})