Javascript 角度2:身份验证后将用户数据存储在Firebase数据库中
我正在尝试在身份验证后在Firebase数据库中创建用户。下面是一个例子: 组成部分:Javascript 角度2:身份验证后将用户数据存储在Firebase数据库中,javascript,angular,firebase,rxjs,angularfire2,Javascript,Angular,Firebase,Rxjs,Angularfire2,我正在尝试在身份验证后在Firebase数据库中创建用户。下面是一个例子: 组成部分: regGoogle() { this.af.auth.login({ provider: AuthProviders.Google, method: AuthMethods.Redirect, }) //Need to invoke this AFTER auth this.memberCreationService
regGoogle() {
this.af.auth.login({
provider: AuthProviders.Google,
method: AuthMethods.Redirect,
})
//Need to invoke this AFTER auth
this.memberCreationService.regGoogle(
auth.auth.providerData[0].email,
auth.auth.providerData[0].displayName,
auth.auth.providerData[0].photoURL,
auth.uid
)
}
我的服务:
regGoogle(
email: string, displayName: string, photoUrl: string, uid: string) {
let member: Object = {
email: email,
displayName: displayName,
picture: photoURL
}
this.af.database.object(`/members/${uid}`).update(member)
}
最初,我在服务的构造函数中调用regGoogle()
,只是为了实现如下基本功能:
this.af.auth.subscribe(auth => {
this.auth = auth;
if (auth) {
this.regGoogle(
auth.auth.providerData[0].email,
auth.auth.providerData[0].displayName,
auth.auth.providerData[0].photoURL,
auth.uid
)
}
})
显然,这对于一个真正的应用程序来说不是很好。首先,它不分青红皂白地调用regGoogle()
。但我的具体问题是,无论我想登录还是注册,都会创建用户。由于auth for providers上没有register方法,因此有必要确定用户是否已经存在于您用于注册/登录的任何方法中
更新:
因此,我们的目标是为每个提供者提供单独的方法,以及我是尝试登录还是注册。这样做的原因是为了避免覆盖和删除现有用户。不仅如此,这一点过于复杂,而且要求强制执行每个操作,并且似乎无法与异步FirebaseAuthState一起工作
我最终整合了注册/登录方法,并在服务收到authstate发射后立即在服务的构造函数中调用它们,就像我之前所做的那样,但检查注册/登录方法中是否存在用户
loginProvider() {
let member: Object = {
email: this.auth.auth.providerData[0].email,
displayName: this.auth.auth.providerData[0].displayName,
picture: this.auth.auth.providerData[0].photoURL
}
this.af.database.object(`members/${this.auth.uid}`)
.take(1)
.subscribe(data => {
if(data.$value === null) {
this.af.database.object(`members/${this.auth.uid}`).update(member)
this.router.navigate(['member-creation'])
} else {
console.log('Thanks for logging in, ' + this.auth.auth.providerData[0].displayName)
this.router.navigate(['threads/featured'])
}
})
}
我很想听听大家对这个实施的意见。我也是新来的!请原谅我的无知,但这是必须的吗?我有点像你做的,但我只是使用了
auth.displayName
作为例子。在这种情况下,登录方法与基本数据无关。Firebase方法足以注册和验证用户,但如果您想将该用户添加到Firebase数据库中,则需要定义某种操作。啊,是的,对不起,我们的代码大致相同。一旦进行身份验证,我就使用state属性(您的Auth
属性)去订阅一个内部可观察的let user$=this.af.database.object(“/members/${Auth.Auth.uid}”)
。然后,我检查该记录是否存在于该调用中。如果没有,我使用auth.auth.email、auth.auth.displayName和auth.auth.photoURL
。(我不在乎是谁提供的)为了构建我的成员
对象,然后我用user$.set(member)
将它发送过来。是的,异步部分让我在这里死里逃生regGoogle
在本质上是必不可少的。我想指定用户向Google注册时采取的操作,但该操作总是在收到授权状态之前采取。我以前只是在构造函数中做的,但我想以某种方式强制地做。。。这可能是因为我还没有完全理解可观察的事物,这可能是因为我执行得不好。也许我需要重新思考我区分注册和登录的方式。其想法是对每一种方法使用单独的方法。我对每个流程都有不同的看法。我也是新手!请原谅我的无知,但这是必须的吗?我有点像你做的,但我只是使用了auth.displayName
作为例子。在这种情况下,登录方法与基本数据无关。Firebase方法足以注册和验证用户,但如果您想将该用户添加到Firebase数据库中,则需要定义某种操作。啊,是的,对不起,我们的代码大致相同。一旦进行身份验证,我就使用state属性(您的Auth
属性)去订阅一个内部可观察的let user$=this.af.database.object(“/members/${Auth.Auth.uid}”)
。然后,我检查该记录是否存在于该调用中。如果没有,我使用auth.auth.email、auth.auth.displayName和auth.auth.photoURL
。(我不在乎是谁提供的)为了构建我的成员
对象,然后我用user$.set(member)
将它发送过来。是的,异步部分让我在这里死里逃生regGoogle
在本质上是必不可少的。我想指定用户向Google注册时采取的操作,但该操作总是在收到授权状态之前采取。我以前只是在构造函数中做的,但我想以某种方式强制地做。。。这可能是因为我还没有完全理解可观察的事物,这可能是因为我执行得不好。也许我需要重新思考我区分注册和登录的方式。其想法是对每一种方法使用单独的方法。我对每个过程都有不同的看法。