# #javascript #reactjs #firebase #google-cloud-firestore
Вопрос:
Я пытаюсь создать функцию, которая создает пользовательский документ с соответствующим идентификатором пользователя в firestore, когда пользователь регистрируется.
function signup(email, password) {
return auth.createUserWithEmailAndPassword(email, password)
.then(cred => {
return firebase.firestore().collection('users').doc(cred.user.uid)
.set({email})
})
}
Он создает нового пользователя при проверке подлинности, однако не создает документ в коллекции пользователей. Я использовал множество вариантов этого кода, найденных в stackoverflow и различных учебных пособиях. Не знаю, что еще можно сделать.
Ответ №1:
Убедитесь, что вы уже создали коллекцию с именем "users"
.
Отредактируйте свой код следующим образом, чтобы зарегистрировать cred и/или ошибки, чтобы вы могли эффективно отладить проблему.
function signup(email, password) {
return auth.createUserWithEmailAndPassword(email, password)
.then(cred => {
console.log(cred);
return firebase.firestore().collection('users').doc(cred.user.uid)
.set({email})
})
}
// as you are returning promise from signup...
signup(email, password)
.then(() => console.log('doc written'))
.catch((error) => {
console.error("Error writing document: ", error);
});
Надеюсь, это направит вас в правильном направлении!
Ответ №2:
Обе операции возвращают обещания, поэтому я бы рекомендовал использовать асинхронную функцию.
async function signup(email, password) {
return auth.createUserWithEmailAndPassword(email, password).then(cred => {
return firebase.firestore().collection('users').doc(cred.user.uid).set({
email
}).then(() => {
console.log("Document Added")
return true
})
})
}
// Handling the promise returned by signup function
signup(email, password).then(() => {
console.log("User document added")
}).catch((e) => console.log(e))
В качестве альтернативы вы можете использовать такой async-await
синтаксис.
async function signup(email, password) {
try {
const cred = await firebase.auth().createUserWithEmailAndPassword(email, password)
await firebase.firestore().collection('users').doc(cred.user.uid).set({
email
})
return true
} catch (e) {
console.log(e)
return e
}
}