Angular 根据数据库中的用户id从数据库中获取用户角色
我使用“身份验证服务”保留所有用户身份验证功能。当对用户进行身份验证时,我获取用户id,并从数据库表中获取相关记录,但无法获取“角色”字段的值。我在构造函数中使用的代码如下:Angular 根据数据库中的用户id从数据库中获取用户角色,angular,firebase,firebase-realtime-database,angular5,Angular,Firebase,Firebase Realtime Database,Angular5,我使用“身份验证服务”保留所有用户身份验证功能。当对用户进行身份验证时,我获取用户id,并从数据库表中获取相关记录,但无法获取“角色”字段的值。我在构造函数中使用的代码如下: constructor( private _firebaseAuth: AngularFireAuth, private db: AngularFireDatabase, private router: Router) { this.user = _firebaseAuth.authStat
constructor(
private _firebaseAuth: AngularFireAuth,
private db: AngularFireDatabase,
private router: Router) {
this.user = _firebaseAuth.authState;
this.user.subscribe(
(user) => {
if (user) {
this.userDetails = user;
this.userEmail = this.userDetails.email;
this.uid = this.userDetails.uid;
this.getUserRole(this.uid).subscribe(result => {
this.role = result.role;
console.log('role >>>>>>>>>>>>>', this.role);
});
console.log('uid >>>>>>>>>>>>>', this.uid);
console.log('role >>>>>>>>>>>>>', this.role);
}
else {
this.userDetails = null;
}
}
);
}
getUserRole(userId: string): Observable<any> {
return this.db.list('users', ref => ref.orderByChild('uid').equalTo(this.uid)).valueChanges()
.map(result => result[0]);
}
构造函数(
private_firebaseAuth:AngularFireAuth,
私有数据库:AngularFireDatabase,
专用路由器(路由器){
this.user=\u firebaseAuth.authState;
此文件为.user.subscribe(
(用户)=>{
如果(用户){
this.userDetails=用户;
this.userEmail=this.userDetails.email;
this.uid=this.userDetails.uid;
this.getUserRole(this.uid).subscribe(结果=>{
this.role=result.role;
console.log('role>>>>>>>>,this.role);
});
console.log('uid>>>>>>>,this.uid);
console.log('role>>>>>>>>,this.role);
}
否则{
this.userDetails=null;
}
}
);
}
getUserRole(userId:string):可观察{
返回此.db.list('users',ref=>ref.orderByChild('uid').equalTo(this.uid)).valueChanges()
.map(结果=>结果[0]);
}
this.uid
具有正确的值,但是this.role
未定义
我假设对数据库表的调用是异步的。
如何获取此值?您无法在外部访问变量。subscribe()方法,请将其放置在subscribe()中
this.currUser.subscribe(val => {
this.role = val[0].role;
console.log(this.role);
});
我添加了一些代码,让您了解observable的回调。看一看
this.currUser.subscribe(
(val) => {
// This is called as success callback
this.role = val[0].role;
// perform task using this.role. You should be writing your code here.
},
(error) => {
// This is called as error callback, It will be executed if any erorrs were thrown from `currUser()`
// log if there are any errors here
},
() => {
// This is called as complete block
// This will be executed after success callback or the error callback.
}
);
更新:
this.user.subscribe(
(user) => {
if (user) {
this.userDetails = user;
this.userEmail = this.userDetails.email;
this.uid = this.userDetails.uid;
this.getUserRole(this.uid).subscribe(result => {
this.role = result.role;
console.log('role >>>>>>>>>>>>>', this.role); // print log 1
});
// log 2 will be executed before log 1 this is due to asynchronous behaviour
console.log('role >>>>>>>>>>>>>', this.role); // print log 2
}
else {
this.userDetails = null;
}
}
);
由于异步行为,日志2将在日志1之前执行。如果您认为代码是按行号顺序执行的,那么您就错了getUserRole
是异步方法
您也可以使用get
或set
从其他组件访问this.role
。你所做的一切都是恰当的
您应该做的是仅在未定义此角色的情况下获取该角色
在您试图访问此.role的外部组件中,首先检查未定义的,然后访问它
其他一些组件
if(this.role != undefined){
let role = this.role
}
演示:
检查异步方法的工作原理我在用户服务中创建了以下函数:
getUserRole(userId: string): Observable<any> {
return this.db.list('users', ref => ref.orderByChild('uid').equalTo(userId)).valueChanges()
.map(result => result[0]);
}
并调用了onNgInit()中的函数:
最后,我在html模板中使用了*ngIf=“role==”
,您是否尝试过this.currUser.subscribe(val=>this.role=val[0].role)
?相同的结果…此.role
在订阅之外未定义您应该等待订阅完成,否则您将始终得到未定义的订阅。像这样?this.user.subscribe(val=>this.role=val[0]。role,()=>);
接下来应该做什么()=>'?如果我把它放在订阅中,我如何使用它?调用一个方法并在内部使用它。这个获取this.currUser as和参数并返回一些东西吗?不只是调用whatever方法newMethod(this.role)this.role
在函数外不可见。问题是this.role
在函数外不可见。我理解结构应该是什么,但我不理解在()=>
外部(val)中应该做什么=>
variablethis.role
仍未定义在执行成功块之前,您不能使用this.role
。这是一个异步操作。您的console.log(this.role)
外部订阅块将在执行成功块之前执行。这就是您未定义的原因。我理解为什么我在console.log
中未定义。如果我将console.log
放入()=>
什么都没有发生。这意味着订阅
永远不会完成?有没有其他方法可以获取值?在代码中,您说控制台.log(This.role)
在成功块中起作用,现在您说什么都没有发生。控制台.log(This.role)
在成功块之外。在遵循您的示例后,我将其放入成功块中,此时什么都没有发生
get uid(): string {
return this.authService.uid;
}
set uid(value: string) {
this.authService.uid = value;
}
ngOnInit() {
if (this.uid != undefined) {
let uid = this.uid;
this.userService.getUserRole(this.uid).subscribe(result => {
this.role = result.role;
});
}
}