AngularFire2使用Angular 6返回“未定义” [object Object]

时间:2018-06-24 22:32:38

标签: javascript angular firebase firebase-realtime-database angularfire2

我尝试从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

3 个答案:

答案 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)-提供保存在数据库中的正确属性。