我是有角度的初学者。当我尝试使用AngularFireDatabase对象检索数据时,我没有获得所需格式的数据
接口:
export interface AppUser {
name: string;
email: string;
isAdmin: boolean;
}
函数调用:
get appUser$():Observable<AppUser>{
return this.user$.pipe(
map(user=> this.userService.get(user.uid)))
}
userService.ts
import { Injectable } from '@angular/core';
import {AngularFireDatabase, AngularFireObject} from angularfire2/database';
import * as firebase from 'firebase';
import {Observable} from 'rxjs/Observable'
import { AppUser } from './models/app-file';
import { AngularFireAuth } from 'angularfire2/auth';
import { map, switchMap } from 'rxjs/operators';
get (uid : string){
let result={};
this.userdetails = this.db.object('/users/'+uid).valueChanges();
return this.userdetails;
}
src / app / auth.service.ts(40,6)中的错误:错误TS2322:类型'Observable>'无法分配给类型'Observable'。 类型“可观察”缺少类型“ AppUser”中的以下属性:名称,电子邮件,isAdmin
答案 0 :(得分:0)
您的所有核心功能(例如,从数据库中获取数据),身份验证卫士应位于单独的模块中。我习惯称它为核心模块。我写这篇文章是因为您提到您是一个初学者。 因此,在这种情况下,请nn您的服务文件执行以下操作:
getDataFromDb(uid) {
return this.db.object('/users/'+ uid).valueChanges();
}
该方法只是从firebase获取用户节点下的数据。方法valueChanges()
自身返回类型Observable<any[]>
的可观察对象
现在,在组件的ts文件中,您应该订阅该可观察对象,并将该值声明为已定义的任何类型或接口。
并在您的ts文件中:
export class Component() {
result: AppUser;
constructor(private service: Service) {}
dataFromService() {
this.userService.getDataFromDb(user.uid).subscribe((res: any) => {
this.result = res;
})
}
}
您在ts文件中当前正在执行的操作是使用map
运算符,除非您订阅该运算符,否则不会发出该值。就您而言,您甚至不必使用pipe
。只需使用subscribe
即可获得可观察值。阅读文档以获得更好的理解:
https://github.com/angular/angularfire2/blob/master/docs/rtdb/objects.md