我目前正在Ionic 4框架(以Firebase为后端)中开发事件应用程序,并且在Cloud Firestore数据库上创建用户时遇到问题。每当我使用Google或Facebook登录名时,Firebase都会在数据库中创建一个新条目,尽管我是使用同一用户登录的。 如果数据库中已经存在当前的user_id,我已经尝试执行检查,但是我的代码似乎有问题。我该如何解决它,以便我的代码正确检查当前用户是否已存在于数据库中?
当前,我正在检查登录组件中的Cloud Firestore数据库中是否已经存在用户。我已经尝试将检查直接构建到用户服务的createUser()函数中。但是行为是完全一样的。
以下代码显示了我的登录组件中的功能:
googleLogin() {
if (this.authService.googleLogin()) {
this.authService.getAuthState().subscribe(user => {
if (user) {
// User is signed in.
console.log("Logged In ", user.email);
this.userId = user.uid;
this.user.name = user.displayName;
this.afs.firestore.doc('user/' + user.uid).get()
.then(docSnapshot => {
if (docSnapshot.exists) {
console.log("user already exists");
} else {
this.userservice.createUser(this.user);
}
});
} else {
console.log("Not Logged In");
this.userId = undefined;
}
}
);
以下代码显示了我的用户服务中的功能:
createUser(user: any): Promise<any> {
return this.afs.collection("user").add({
blockPushMessages: user.blockPushMessages,
email: user.email,
isAnonymous: user.isAnonymous,
name: user.name,
partyLevel: user.partyLevel,
aliasName: user.aliasName,
dateOfBirth: user.dateOfBirth,
gender: user.gender,
homeTown: user.homeTown,
personImage_id: user.personImage_id,
registrationDate: user.registrationDate,
relationshipStatus: user.relationshipStatus,
school: user.school
});
}
以下代码显示了我的身份验证服务中的google登录功能:
googleLogin() {
if (this.platform.is("cordova")) {
this.nativeGoogleLogin();
} else {
this.webGoogleLogin();
}
return true;
}
async nativeGoogleLogin(): Promise<firebase.User> {
try {
const gplusUser = await this.gplus.login({
webClientId:
"**********",
offline: true,
scopes: "profile email"
});
return await this.afAuth.auth.signInWithCredential(
firebase.auth.GoogleAuthProvider.credential(gplusUser.idToken)
);
} catch (err) {
console.log(err);
}
}
async webGoogleLogin(): Promise<void> {
try {
const provider = new firebase.auth.GoogleAuthProvider();
const credential = await this.afAuth.auth.signInWithPopup(provider);
} catch (err) {
console.log(err);
}
}
我期望代码检查我的Cloud Firestore数据库中是否已存在当前用户。目前的实际结果是,即使我使用同一用户登录,该代码也会忽略该检查,而只是在数据库上创建一个新用户。
如果有人知道我的代码出了什么问题,请告诉我。我将不胜感激!
答案 0 :(得分:1)
好像您在比较uid,您确定uid是您后端的用户ID吗?
答案 1 :(得分:1)
我实际上是将uid与数据库中随机生成的文档ID进行比较。现在,通过为用户对象提供一个internal_id并使用uid而不是随机生成的文档ID在数据库上创建用户文档,来修复代码。这是可行的解决方案:
我的用户服务中的代码:
createUser(user: any): Promise<any> {
return this.afs.collection("user").doc(user.internal_id).set({
internal_id: user.internal_id,
blockPushMessages: user.blockPushMessages,
email: user.email,
isAnonymous: user.isAnonymous,
name: user.name,
partyLevel: user.partyLevel,
aliasName: user.aliasName,
dateOfBirth: user.dateOfBirth,
gender: user.gender,
homeTown: user.homeTown,
personImage_id: user.personImage_id,
registrationDate: user.registrationDate,
relationshipStatus: user.relationshipStatus,
school: user.school
});
}
我的登录组件中的代码:
googleLogin() {
if (this.authService.googleLogin()) {
this.authService.getAuthState().subscribe(user => {
if (user) {
// User is signed in.
console.log("Logged In ", user.email);
this.user.internal_id = user.uid;
this.internal_id = user.uid;
this.user.name = user.displayName;
this.afs.firestore.doc('user/' + this.internal_id).get()
.then(docSnapshot => {
if (docSnapshot.exists) {
console.log("user already exists");
} else {
this.userservice.createUser(this.user);
}
});
} else {
console.log("Not Logged In");
this.userId = undefined;
}
}
);