Я делаю веб-приложение в Angular 6, где пользователи могут создать учетную запись. В форме они указывают свои имена, пол, рождение и т. д. Я хотел бы сохранить эти данные в Firestore при создании новой учетной записи.
Сейчас учетная запись создана правильно, но данные не сохраняются в Firestore.
Я попытался установить функцию как async
и вызов для добавления данных в Firestore как await
, но это не сработало. Я думал, что строка сохранения данных в Firestore игнорируется.
Моя пользовательская модель:
export interface User {
firstName: string;
secondName: string;
firstSurname: string;
secondSurname: string;
emailAddress: string;
}
Когда вы заполните форму и нажмете «Отправить»:
onFormSubmit() {
const password = this.personalInformation.get('password').value;
const user: User = {
firstName: this.personalInformation.get('firstName').value,
secondName: this.personalInformation.get('secondName').value,
firstSurname: this.personalInformation.get('firstSurname').value,
secondSurname: this.personalInformation.get('secondSurname').value,
emailAddress: this.personalInformation.get('emailAddress').value
};
this.authService.register(user, password)
.then(res => {
}, err => {
console.log(err);
});
}
Метод создания пользователя и добавления данных в Firestore:
register(user: User, password: string) {
return new Promise<any>((resolve, reject) => {
this.afAuth.auth.createUserWithEmailAndPassword(user.emailAddress, password)
.then(res => {
Object.assign(user, {
'dateOfCreationAccount': new Date(res.user.metadata.creationTime),
'lastSignInTime': new Date(res.user.metadata.lastSignInTime)
});
// Add user to firestore
this.firestoreService.addUser(res.user.uid, user);
// Send verification email
this.sendVerificationEmail();
// Logout user
this.logout();
resolve(res);
}, err => reject(err));
});
}
Тот же метод с async
/await
:
register(user: User, password: string) {
return new Promise<any>((resolve, reject) => {
this.afAuth.auth.createUserWithEmailAndPassword(user.emailAddress, password)
.then(async res => {
Object.assign(user, {
'dateOfCreationAccount': new Date(res.user.metadata.creationTime),
'lastSignInTime': new Date(res.user.metadata.lastSignInTime)
});
// Add user to firestore
await this.firestoreService.addUser(res.user.uid, user);
// Send verification email
this.sendVerificationEmail();
// Logout user
this.logout();
resolve(res);
}, err => reject(err));
});
}
Способ добавления данных в Firestore:
addUser(uid: string, data: User) {
this.usersCollection.doc(uid).set(data);
}
Кажется, что строка this.firestoreService.addUser
игнорируется. Идея состоит в том, чтобы сохранить данные пользователя сразу в Firestore после создания его учетной записи.
Попробуйте изменить это:
addUser(uid: string, data: User) {
this.usersCollection.doc(uid).set(data);
}
к этому:
async addUser(uid: string, data: User) {
await this.usersCollection.doc(uid).set(data);
}
Изменить 1 Еще немного пояснений. Если у вас есть Обещать и вы хотите дождаться значения после разрешения, вы можете использовать ключевое слово Ждите, но для его использования вам нужно добавить модификатор асинхронный к методу/функции, и везде, где вы будете использовать, вы должны добавить Ждите перед выполнение метода/функции. Этот Ждите можно пропустить, и IDE, вероятно, предупредит вас, но чтобы быть уверенным, что он будет ждать выполнения этого конкретного действия, вы должны добавить Ждите.