javascript - 如果我有来自 Cloud Firestore 的其他自定义数据,如何获取用户数据?
问题描述
因此,我存储了用户的电子邮件、姓名、年龄、电话号码和 uid。
user.model.ts:
export interface User {
uid: string,
name: string,
email: string,
phoneNumber: string,
age: string
}
auth.service.ts:
userData: any;
constructor(
private http: HttpClient,
private alertCtrl: AlertController,
public afs: AngularFirestore,
public afAuth: AngularFireAuth,
public router: Router
) {
/* Saving user data in localstorage when
logged in and setting up null when logged out */
this.afAuth.authState.subscribe( user => {
if(user) {
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
JSON.parse(localStorage.getItem('user'));
}else{
localStorage.setItem('user', null);
JSON.parse(localStorage.getItem('user'));
}
})
}
// Returns true when user is logged in (and email is verified)
get isLoggedIn(): boolean {
const user = JSON.parse(localStorage.getItem('user'));
return (user !== null) ? true : false;
}
setUserData(user, name?, phoneNumber?, age?) {
const userRef : AngularFirestoreDocument<any> = this.afs.doc(`users/${user.uid}`);
const userData: User = {
uid: user.uid,
name,
email: user.email,
phoneNumber,
age,
}
return userRef.set(userData, {
merge: true
})
}
// Sign up with email/password
signup(name, email, phoneNumber, age, password) {
return this.afAuth.createUserWithEmailAndPassword(email, password)
.then( (result) => {
this.setUserData(result.user, name, phoneNumber, age);
this.router.navigate(['/home']);
}).catch((error) => {
const code = error.code;
let message = 'Could not sign up, please try again.';
if(code === 'auth/email-already-in-use') {
message = 'The email address exists already.';
}else if(code === 'auth/invalid-password') {
message = 'Password should be at least 6 characters';
}else if(code === 'auth/invalid-email') {
message = 'Invalid email.';
}
this.showAlert(message);
})
}
// Sign in with email/password
signIn(email, password) {
return this.afAuth.signInWithEmailAndPassword(email, password)
.then( (result) => {
this.setUserData(result.user);
this.router.navigate(['/home']);
}).catch( (error) => {
const code = error.code;
let message = 'Could not sign up, please try again.';
if(code === 'auth/invalid-email') {
message = 'Invalid email.';
}else if(code === 'auth/wrong-password') {
message = 'Password is wrong.';
}else if(code === 'auth/user-not-found') {
message = 'User not found.';
}
this.showAlert(message);
});
}
我想显示用户数据的 home.page.html:
<ion-content>
<!-- Show user data when logged in -->
<div class="row" *ngIf="authService.userData as user">
<div class="col-md-12">
<div class="media-body">
<h1>Hello: <strong>{{user.name}}</strong></h1>
<p>User ID: <strong>{{user.uid}}</strong></p>
<p>Email: <strong>{{user.email}}</strong></p>
<p>Phone number: <strong>{{user.phoneNumber}}</strong></p>
<p>Age: <strong>{{user.age}}</strong></p>
</div>
</div>
</div>
</ion-content>
数据被传递到数据库中。但问题是我无法显示姓名、年龄、电话号码等自定义数据。只是出现电子邮件和uid。所以有什么问题?如何显示来自 Cloud Firestore 的自定义数据?
解决方案
是因为你没有定义姓名、电话号码和年龄吗?
#打字稿
setUserData(user, name?, phoneNumber?, age?) {
const userRef : AngularFirestoreDocument<any> = this.afs.doc(`users/${user.uid}`);
const userData: User = {
uid: user.uid,
name: user.name,
email: user.email,
phoneNumber: user.phoneNumber,
age: user.age,
}
return userRef.set(userData, {
merge: true
})
}
请让我知道它是否有效?我仍在学习。谢谢你。
推荐阅读
- typescript - 使用 Chart.js 绘制方法作为 Typescript 箭头函数
- c++ - 如何在另一个 c++ 文件中声明 Paho MQTT C++?
- karate - 在空手道框架中,无法通过解析获取 xml 响应中的值
- sql-server - 合并一列,同时对具有相似值的另一列进行分组
- r - 使用 R 中另一个表的范围内的表中的点连接
- c# - C# Memoization 方法在返回函数后如何保留缓存
- spring - Spring Boot 自定义启动器和 Spring Data JPA - 如何在我自己的自定义自动配置/启动器模块上正确提供存储库
- c# - C# 电报机器人收到“对 SSPI 的调用失败”错误
- java - 为什么当我们有自定义实现时,Java 不强制我们重写 equals 和 hashcode
- rust - 有没有一种优雅的方式来使用“match”语句重写获取或创建选项?