Функция создает новую аутентификацию пользователя в firebase, но не создает соответствующий документ в коллекции пользователей

# #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
  }
}