Как я могу обновить профиль пользователя при регистрации пользователя в Firebase-v9 с помощью Typescript?

# #reactjs #typescript #firebase #react-native #firebase-authentication

#реагирует на #машинописный текст #огневая база #реагировать-родной #firebase-аутентификация

Вопрос:

Я пытаюсь зарегистрировать пользователя, а затем updateUserProfile с помощью так называемой функции.

Сначала у меня возникла проблема с type пользователем, которую я решил , импортировав User тип из firebase, и я проверяю, есть ли currentUser , чтобы удовлетворить эту null возможность.

Я думаю, что проблема в этой последней проверке, потому что содержимое функции не запускается. А именно, я думаю, что пользователь еще не зарегистрирован.

Примечание: если я это сделаю: const user: User = this.auth.currentUser;

Я попадаю в updateProfile(user) эту ошибку type 'User | null' is not assignable to type 'User'.

Если я это сделаю: const user: User | null = this.auth.currentUser;

Я получаю эту ошибку:

Argument of type 'User | null' is not assignable to parameter of type 'User'.

Вот почему я закончил проверку вот так:

 if (this.auth.currentUser) { const user: User = this.auth.currentUser;  

Так как же я могу заставить это работать?

Вариантом может быть регистрация onAuthStateChanged на home экране после регистрации , а затем запуск updateUserProfile , где я передам имя, которое я бы при регистрации просто сохранил в redux.

В Firebase-v8 я мог updateUserProfile бы просто createUserWithEmailAndPassword функционировать. Я уверен, что должен быть способ сделать это также в версии 9, но и с Typescript тоже.

Любая помощь будет признательна.

Спасибо

 import { createUserWithEmailAndPassword, getAuth, sendPasswordResetEmail, updateProfile, User } from 'firebase/auth';    async signUp(email: string, password: string, name: string) {  createUserWithEmailAndPassword(this.auth, email, password)  .then(async userCredential =gt; {  console.log('userCredential', userCredential);   await this.updateUserProfile(name);  }).catch((error) =gt; {  const errorCode = error.code;  const errorMessage = error.message;  })  }   async updateUserProfile(name: string) {   if (this.auth.currentUser) {  const user: User = this.auth.currentUser;   updateProfile((user), {  displayName: name, photoURL: `https://gravatar.com/avatar${md5(user.email)}?d=identicon`  }).then((user) =gt; {  // Profile updated!  console.log('Profile updated!', user);   }).catch((error) =gt; {  // An error occurred  console.log(error);   });  }  }  

Ответ №1:

Значение this.auth.currentUser может быть равно null, если состояние аутентификации еще не загружено. В этом случае вы можете передать объект пользователя из самой учетной записи пользователя, как показано ниже:

 createUserWithEmailAndPassword(this.auth, email, password)  .then(async userCredential =gt; {  console.log('userCredential', userCredential);  await this.updateUserProfile(userCredential.user, name);  // Pass user object from here ^^^ })  // Take user object as parameter async updateUserProfile(user: User, name: string) {  updateProfile((user), {  displayName: name, photoURL: `https://gravatar.com/avatar${md5(user.email)}?d=identicon`  }) }