Firebase не сохраняет данные пользователя в Firestore после создания пользователя с помощью FirebaseAuthentication - Angular 9 - PullRequest
0 голосов
/ 20 июня 2020

У меня есть веб-приложение Angular 9 , и до сих пор я неплохо работал с Firestore . У меня есть форма для добавления пользователя, которая правильно сохраняет пользователя в Firestore , но без добавления их в Прошедшие проверку пользователи , функция добавления будет удалена, когда я исправлю проблему ниже.

users.component.ts :

this.userService.addUser(user);

и в userService Я звоню:

 async addUser(user: User) {
      await this.firestore.collection('users').doc(user.email).set(user);
 }

проблема - , когда я хочу зарегистрировать нового пользователя с помощью FirebaseAuthentication , данные пользователя не сохраняются в коллекции users . Когда пользователь нажимает Register в register.component.ts , я вызываю:

   register() {
        this.authenticationService
            .register(this.form.controls['email'].value, this.form.controls['password'].value)
            .then(() => {
                this.userService.addUser({
                    nickname: this.form.controls['nickname'].value,
                    email: this.form.controls['email'].value,
                    role: 'Customer',
                });
            })
            .catch((error) => {
                console.log(error);
            });
    }

Метод регистрации в authenticationService.ts :

    register(email: string, password: string) {
        return this.angularFireAuth.auth.createUserWithEmailAndPassword(email, password);
    }

Я пробовал разные подходы, используя Promises, asyn c / await, вызывая непосредственно из метода регистрации в authenticationService.ts , используя collection ('users'). Add вместо набора, используя uid, я получаю в ответ как uid документа вместо адреса электронной почты.

Я склонен думать, что существует какой-то механизм отката, поскольку я подписался на данные $:

this.firestore
    .collection<User>(this.path)
    .snapshotChanges()
    .pipe(
        takeUntil(this.destroy$),
        map((items) => {
            return items.map((item) => {
                const data = item.payload.doc.data() as User;

                return {
                    ...data,
                };
            });
        })
    )
    .subscribe((data) => {
        this.users$.next(data);
    });

in register.component.ts ngOnInit:

  this.userService.users$.subscribe((data) => {
        console.log(data);
  });

Что дало мне некоторое представление:

Журналы 4, затем 3

Тема срабатывает дважды мгновенно, с 4 элементами, а затем с 3 элементами.

users.component.ts

constructor(private userService: UserService, public dialog: MatDialog) {}

register.component.ts

constructor(
    private userService: UserService,
    private formBuilder: FormBuilder,
    private authenticationService: AuthenticationService
) {}

Оба компонента являются частью одного модуля, но по какой-то причине, если я перейду к users.component.ts , а затем к register.component.ts сохраняет пользователь работает ! Он добавляется к коллекциям прошедших проверку пользователей и Firestore пользователей.

Я не получаю никаких ошибок в любой момент.

Так что у меня действительно есть не знаю, что может быть причиной того, что он ведет себя по-другому, но мне нужно, чтобы он работал с register.component.ts без предварительного перехода к users.component.ts .

РЕДАКТИРОВАТЬ:

Мои правила:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020, 8, 6);
    }
  }
}

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Если вы видите такой откат, это обычно означает, что сервер отклонил операцию записи на основании правил безопасности, которые вы указали для базы данных. Таким образом, похоже, что у пользователя нет разрешения на запись.

Вам нужно будет изменить правила безопасности базы данных на , чтобы пользователь мог записывать данные своего профиля .

1 голос
/ 20 июня 2020

Вам придется вручную добавить созданного пользователя в вашу коллекцию. После успешного выполнения createUserWithEmailAndPassword () следует вызвать пользовательскую функцию, которая получает объект пользователя и сохраняет его в Firestore. пример:

register(email: string, password: string) {
    let rs = this.angularFireAuth.auth.createUserWithEmailAndPassword(email, password);
    return this.saveUser(rs.user)
}
saveUser(user){
    const userRef: AngularFirestoreDocument<User> = this.angularFistore.doc(`users/${user.email}`);

    userRef.get().subscribe(snapDoc =>{
      if(!snapDoc.exists){
        const data; //Initialize 
        //do anything else
        return userRef.set(data, { merge: true })
      })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...