首页 文章

AngularFire2使用Angular 6返回'undefined' [object Object]

提问于
浏览
1

我试图从 firebase 数据库中获取详细信息,但继续获取 undefined 这是我从数据库中获取Object的代码:

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中,我需要在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

    使用 JSON.stringify

    Console.log(JSON.stringify(this.db.object('/users/' + uid)));
    
  • 0

    您将返回AngularFireDatabase .
    您想订阅AngularFireObject . 所以,你必须打电话:

    get(uid: string): AngularFireObject<any> { // <----
      console.log(this.db.object('/users/' + uid));
      return this.db.object('/users/' + uid).valueChanges(); // <---
    }
    

    而且,您可以订阅并显示组件中的对象 .

    --Updated--当前对象类型是单个对象的AngularFireObject和对象列表的AngularFireList . 你仍然需要调用.valueChanges()来获得observable .

  • 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);
        }
    }
    

    这是Authentication 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) - 提供保存在数据库中的正确属性 .

相关问题