Angular 根据数据库中的用户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

我使用“身份验证服务”保留所有用户身份验证功能。当对用户进行身份验证时,我获取用户id,并从数据库表中获取相关记录,但无法获取“角色”字段的值。我在构造函数中使用的代码如下:

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)中应该做什么=>
variable
this.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;
        });
    }
}