Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度2:身份验证后将用户数据存储在Firebase数据库中_Javascript_Angular_Firebase_Rxjs_Angularfire2 - Fatal编程技术网

Javascript 角度2:身份验证后将用户数据存储在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

我正在尝试在身份验证后在Firebase数据库中创建用户。下面是一个例子:

组成部分:

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注册时采取的操作,但该操作总是在收到授权状态之前采取。我以前只是在构造函数中做的,但我想以某种方式强制地做。。。这可能是因为我还没有完全理解可观察的事物,这可能是因为我执行得不好。也许我需要重新思考我区分注册和登录的方式。其想法是对每一种方法使用单独的方法。我对每个过程都有不同的看法。