Как сделать так, чтобы при создании пользователя он был добавлен в «пользовательский» Firestore? - PullRequest
0 голосов
/ 04 апреля 2020

В настоящее время возникают трудности с выяснением того, как добавить возможность, при создании которой учетная запись добавляется в Firestore в коллекции, называемой «пользователи». Из того, что я видел от других людей, они добавили что-то вроде этого

.then then(userCredential => {
firestore.collection('users').doc(userCredential.user.uid).set({name})
}

Это мой код в том виде, в каком он стоит после моей попытки сделать это. Я не уверен, где я должен добавить в свой код. В настоящее время у меня это под this.fireauth.auth.createUserWithEmailAndPassword(this.email, this.password), и попытка, которую я сделал, заключается в том, что программа отлично работает, я могу зарегистрировать учетную запись и увидеть учетную запись в аутентификации на вкладке пользователей аутентификации firebase, но коллекция 'user' не создана в магазине огня. В настоящее время я нахожусь в тупике, где я должен go отсюда. Все, что мне действительно нужно, это имя пользователя / имя, которое будет сохранено в Firestore.

import { Component, OnInit } from '@angular/core';
import { Platform, AlertController } from '@ionic/angular';
import { LoadingController, ToastController } from '@ionic/angular';
import { Router } from '@angular/router';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';

@Component({
  selector: 'app-register',
  templateUrl: './register.page.html',
  styleUrls: ['./register.page.scss'],
})
export class RegisterPage {
  email: string = '';
  password: string = '';
  error: string = '';
  username: string = '';
  image: number;
  constructor(private fireauth: AngularFireAuth, private router: Router, private toastController: ToastController, private platform: Platform, public loadingController: LoadingController,
    public alertController: AlertController, private firestore: AngularFirestore) {

  }

  async openLoader() {
    const loading = await this.loadingController.create({
      message: 'Please Wait ...',
      duration: 2000
    });
    await loading.present();
  }
  async closeLoading() {
    return await this.loadingController.dismiss();
  }

  signup() {
    this.fireauth.auth.createUserWithEmailAndPassword(this.email, this.password)
      .then(res => {
        if (res.user) {
          console.log(res.user);
          this.updateProfile();
          userCredential => this.firestore.collection('users').doc(userCredential.user.uid).set({
              name
            })
        }
      })
      .catch(err => {
        console.log(`login failed ${err}`);
        this.error = err.message;
      });
  }

  updateProfile() {
    this.fireauth.auth.onAuthStateChanged((user) => {
      if (user) {
        console.log(user);
        user.updateProfile({
          displayName: this.username,
          photoURL: `https://picsum.photos/id/${this.image}/200/200`
        })
          .then(() => {
            this.router.navigateByUrl('/home');
          })
      }
    })
  }

  async presentToast(message, show_button, position, duration) {
    const toast = await this.toastController.create({
      message: message,
      showCloseButton: show_button,
      position: position,
      duration: duration
    });
    toast.present();
  }
}

Это текущие правила, которые я установил для своей базы данных.

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


    match /users/{userId} {
    allow read: if request.auth != null;
    allow write: if request.auth.uid == userId;
}
  }
}

1 Ответ

0 голосов
/ 06 апреля 2020

Похоже, что есть проблема с функцией стрелки:

userCredential => this.firestore.collection('users').doc(userCredential.user.uid).set({name})

Кажется, вы только инициализируете функцию, но никогда не вызываете ее. Попробуйте изменить эту строку на:

this.firestore.collection('users').doc(user.uid).set({name})

или вызвать анонимную функцию, если вы предпочитаете, например, свое решение:

//... some logic
const initialize = user => this.firestore.collection('users').doc(user.uid).set({name})

initialize(user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...