Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
Angular 无法使用函数更新用户数据_Angular_Typescript_Firebase_Google Cloud Firestore_Angularfire2 - Fatal编程技术网

Angular 无法使用函数更新用户数据

Angular 无法使用函数更新用户数据,angular,typescript,firebase,google-cloud-firestore,angularfire2,Angular,Typescript,Firebase,Google Cloud Firestore,Angularfire2,在我的Angular项目中,我尝试使用一个登录功能,让用户通过google登录,然后根据他们是否已经拥有批准的角色来更新他们的用户数据 当试图实现这一点时,我的console.log语句都不会启动,因此我不确定我能做些什么来进入这些块 async handleSignIn(){ const credential=wait this.afAuth.signInWithPopup(new firebase.default.auth.GoogleAuthProvider()); 返回此.manageU

在我的Angular项目中,我尝试使用一个登录功能,让用户通过google登录,然后根据他们是否已经拥有
批准的
角色来更新他们的用户数据

当试图实现这一点时,我的
console.log
语句都不会启动,因此我不确定我能做些什么来进入这些块

async handleSignIn(){
const credential=wait this.afAuth.signInWithPopup(new firebase.default.auth.GoogleAuthProvider());
返回此.manageUserData(credential.user)
}
专用异步manageUserData(用户:用户){
让数据$;//Init变量
让我们更新$;//Init变量
const userCollection=this.afs.collection('users');//设置数据的路径
console.log(user.uid);
data$=userCollection.doc(user.uid).snapshotChanges().pipe(//获取文档
映射(action=>{//映射到能够做的事情
const payload=action.payload.data();//将有效负载数据设置为主“payload”变量
控制台日志(“就地”,有效载荷)
if(payload.roles.approved==true | | false){
控制台日志(“主块”)
更新$={
uid:user.uid,
电子邮件:user.email,
displayName:user.displayName,
photoURL:user.photoURL
}
}否则{
console.log(“else块”)
更新$={
uid:user.uid,
电子邮件:user.email,
displayName:user.displayName,
photoURL:user.photoURL,
角色:{
批准:错误
}
}
}
const userRef:AngularFirestoreDocument=this.afs.doc(`users/${user.uid}`);
返回userRef.set(更新$,{merge:true});
})
)
}
console.log(user.uid)
语句返回我的firebase uid:
rKlGL943eqfaPVWLh2EEUVBoOvg2

编辑:我还尝试在这里使用三元运算符并更好地组织函数:

function hasApprovedStatus() {
      update$ = {
        uid: user.uid,
        email: user.email,
        displayName: user.displayName,
        photoURL: user.photoURL
      }
      userRef.set(update$, { merge: true });
    }
    function hasNoApprovedStatus() {
      update$ = {
        uid: user.uid,
        email: user.email,
        displayName: user.displayName,
        photoURL: user.photoURL,
        roles: {
          approved: false
        }
      }
      userRef.set(update$, { merge: true })
    }
data$ = userCollection.doc<User>(user.uid).snapshotChanges().pipe( // Fetches Document
      map(action => action.payload.data().roles.approved ? hasApprovedStatus() : hasNoApprovedStatus())
    )
  }
函数hasApprovedStatus(){
更新$={
uid:user.uid,
电子邮件:user.email,
displayName:user.displayName,
photoURL:user.photoURL
}
set(更新$,{merge:true});
}
函数hasNoApprovedStatus(){
更新$={
uid:user.uid,
电子邮件:user.email,
displayName:user.displayName,
photoURL:user.photoURL,
角色:{
批准:错误
}
}
userRef.set(更新$,{merge:true})
}
data$=userCollection.doc(user.uid).snapshotChanges().pipe(//获取文档
映射(action=>action.payload.data().roles.approved?hasApprovedStatus():hasNoApprovedStatus())
)
}

问题可能是您的异步方法
manageUserData()
实际上没有返回任何内容

该方法正在从
userCollection.doc(user.uid).snapshotChanges()
创建一个可观察对象,并将其分配给本地变量
data$
,但它不会从该方法返回,也不会订阅它。因此,您似乎正在创建一个从未订阅过的可观察对象,因此您的
map
函数将永远不会被调用

您需要做的是
返回
您正在创建的可观察对象(此外,除非您打算将该变量用于某些事情,否则无需将其分配给本地var):

返回userCollection.doc(user.uid).snapshotChanges().pipe(。。。
这将导致
manageUserData()
返回一个承诺(因为它是
async
),该承诺解析为可观察的

由于
handleSignIn()
返回
manageUserData()
的返回值,该承诺将传递给调用
handleSignIn()
的任何人。该调用方法如下所示:

异步登录(){
consthandle:可以在模拟版本的方法调用链正常工作时观察到

对评论的回应更新,2020年12月29日:

如果需要过滤流,以便
map
函数中的第一行
const payload=action.payload.data()
始终从方法调用
action.payload.data()
中检索值,则可以在
map
之前向管道中添加运算符:

返回userCollection.doc(user.uid).snapshotChanges().pipe(
过滤器(action=>Boolean(action.payload?.data?()),
映射(操作=>{…)
)
还有几个其他的观察结果:

  • 映射
    函数的第一行是
  • const payload=action.payload.data();
    
    您正在调用
    payload
    属性上的
    data()

  • 映射
    函数中的第三行是
  • if(payload.roles.approved==true | | false){。。。
    
    这是一个奇怪的构造条件。你测试的是什么条件

    | | false
    基本上没有任何作用,因为只有当
    payload.roles.approved==true
    false
    时才会对其进行评估,因此您只需检查
    if(false | | false)
    ,这似乎不是很有用

    如果您的目的是检查
    有效负载.roles.approved
    是否严格
    为true
    或严格
    为false
    ,那么您可以这样做(请注意,我使用的是严格相等,
    ====
    ,而不是松散相等,因为这是首选的,除非有充分的理由使用松散相等):

    if(payload.roles.approved==true | | payload.roles.approved==false){。。。
    
    在使用console.log(user.uid)
    之前,是否可以添加一个
    console.log(user.uid)
    ,并包含更新的代码和