我尝试从firebase
数据库获取详细信息,但一直在获取undefined
这是我从数据库中获取对象的代码:
import { AppUser } from './models/app-user';
import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import * as firebase from 'firebase';
@Injectable({
providedIn: 'root'
})
export class UserService {
constructor(private db: AngularFireDatabase ) { }
get(uid: string): AngularFireObject<AppUser> {
console.log(this.db.object('/users/' + uid));
return this.db.object('/users/' + uid);
}
}
此get
方法的控制台日志为:[object Object]
我找不到如何获取该用户的用户名或其他信息。
这是我的AppUser:
export interface AppUser {
email: string;
isAdmin: boolean;
name: string;
}
我找到了一些答案,但它与Angular的旧版本有关,对我的问题没有帮助。 我还看到了与异步管道相关的一些答案,但这是在HTML中,并且我需要data在service.ts文件中可用。 我需要在组件中获取结果(而不是在html中)。
我试图像这样提取用户的数据:
get appUser$(): Observable<AppUser> {
return this.user$
.pipe<AppUser>(map(user => {
if ( user ) {
this.userService.get(user.uid);
}
}));
}
但是再次日志显示我得到了[object Object]
...
在我需要使用此信息的最后一种方法中:
canActivate() {
return this.auth.appUser$
.pipe(map(user => {
console.log(user);
return user.isAdmin;
}));
}
控制台日志提供undefined
答案 0 :(得分:0)
使用 JSON.stringify
Console.log(JSON.stringify(this.db.object('/users/' + uid)));
答案 1 :(得分:0)
您将返回AngularFireDatabase。
您要订阅AngularFireObject。因此,您必须致电:
get(uid: string): AngularFireObject<any> { // <----
console.log(this.db.object('/users/' + uid));
return this.db.object('/users/' + uid).valueChanges(); // <---
}
然后,您可以订阅并显示组件中的对象。
-更新- 当前的对象类型是AngularFireObject(单个对象)和AngularFireList(对象列表)。 您仍然必须调用.valueChanges()以获得可观察的结果。
答案 2 :(得分:0)
在您和其他博客的帮助下,我设法解决了这一问题。非常感谢! 这是完整的解决方案:
用户service.ts文件:
import { AppUser } from './models/app-user';
import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import * as firebase from 'firebase';
@Injectable({
providedIn: 'root'
})
export class UserService {
constructor(private db: AngularFireDatabase ) { }
get(uid: string): AngularFireObject<AppUser> {
return this.db.object('/users/' + uid);
}
}
这是身份验证service.ts文件:
import { AppUser } from './models/app-user';
import { pipe } from 'rxjs';
import { CanActivate } from '@angular/router';
import { Injectable } from '@angular/core';
import { UserService } from './user.service';
import { map } from 'rxjs/operators';
import * as firebase from 'firebase';
@Injectable({
providedIn: 'root'
})
export class AdminAuthGuard implements CanActivate {
fireBuser: firebase.User;
constructor(private userService: UserService) { }
canActivate() {
this.fireBuser = firebase.auth().currentUser;
return this.userService.get(this.fireBuser.uid)
.valueChanges()
.pipe(map((appUser: AppUser) => {
console.log(appUser.isAdmin);
return appUser.isAdmin;
}));
}
}
console.log(appUser.isAdmin)-提供保存在数据库中的正确属性。