Angular新手:Firebase实时数据库取数格式不符及类型错误求助
解决AngularFireDatabase获取数据时的类型不匹配问题
嘿,我一眼就看出问题出在哪了——你在appUser$里用了map操作符,但其实应该用switchMap!让我给你拆解一下:
错误根源
当你用map(user=> this.userService.get(user.uid))的时候,this.userService.get()返回的是一个Observable<AppUser>,所以map会把外层的Observable<User>转换成Observable<Observable<AppUser>>,这就和你声明的返回类型Observable<AppUser>不匹配了,这正是报错的核心原因。
switchMap的作用就是帮你“扁平化”这个嵌套的Observable——它会自动订阅内部的Observable,把内部流的值直接传递到外层,最终返回的就是Observable<AppUser>,完美匹配你的类型声明。
修复步骤
- 修正
auth.service.ts里的appUser$
把map换成switchMap即可:
get appUser$(): Observable<AppUser> { return this.user$.pipe( switchMap(user => this.userService.get(user.uid)) // 用switchMap替代map ); }
- 完善
userService.ts的类型安全与代码规范
你的userService里还有几个小细节可以优化,同时修正潜在的错误:
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-user'; // 修正导入路径,应该是app-user而非app-file import { AngularFireAuth } from 'angularfire2/auth'; import { map, switchMap } from 'rxjs/operators'; @Injectable() export class UserService { // 补全类的声明 userdetails: AngularFireObject<any>; constructor(private db: AngularFireDatabase) {} // 注入AngularFireDatabase实例 get(uid: string): Observable<AppUser> { // 指定明确的返回类型 // 无需额外的result变量,直接返回valueChanges的结果并做类型断言 return this.db.object('/users/' + uid).valueChanges() as Observable<AppUser>; } }
- 额外验证
确保你的Firebase实时数据库中/users/{uid}节点的结构和AppUser接口完全一致,比如:
{ "name": "John Doe", "email": "john@example.com", "isAdmin": false }
这样修改之后,类型不匹配的错误就会消失,你也能正确获取到符合AppUser格式的数据啦!
内容的提问来源于stack exchange,提问作者Manju John
相关产品推荐
相关产品推荐

