Angular 无法使用函数更新用户数据
在我的Angular项目中,我尝试使用一个登录功能,让用户通过google登录,然后根据他们是否已经拥有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
批准的
角色来更新他们的用户数据
当试图实现这一点时,我的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)
,并包含更新的代码和