У меня есть веб-приложение 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);
}
}
}