AngularFire2 возвращает «неопределенный» [объект] с Angular 6 - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь получить информацию из базы данных 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, и мне нужно, чтобы данные были доступны в файле 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 голосов
/ 25 июня 2018

Вы возвращаете 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 (), чтобы получить наблюдаемое.

0 голосов
/ 25 июня 2018

Мне удалось решить это с помощью вас и других блогов.Большое спасибо!Вот полное решение:

Пользовательский файл 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) - укажите правильное свойство, сохраненное в базе данных.

0 голосов
/ 25 июня 2018

Использование JSON.stringify

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