You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AngularFire2中扩展firebase.User并添加自定义字段至集合?

解决AngularFire2中为firebase.User添加自定义字段并存入Firestore的问题

这个问题我之前也碰到过!核心原因是firebase.User是Firebase SDK创建的内置对象,你直接给它添加的自定义属性(比如points)默认是不可枚举的,所以用JSON.stringify序列化的时候会被直接忽略——这就是为什么你存进Firestore后看不到这个字段的原因。虽然你定义了扩展接口,但那只是TypeScript的类型声明,不会改变实际JavaScript对象的结构和属性枚举性。

给你几个更靠谱的解决方案,比你现在先存再更新的临时方案更高效:

方法1:手动构建待存储的用户数据对象(最推荐)

直接提取firebase.User里你需要的核心字段,再和自定义字段合并成一个新对象,这样你能完全控制要存储的数据,避免把Firebase用户对象里的内部属性也存进去:

// 提取必要的用户字段 + 自定义字段
const userToSave = {
  uid: user.uid,
  displayName: user.displayName,
  email: user.email,
  photoURL: user.photoURL,
  points: 1 // 你的自定义字段
};

// 一次性存入Firestore
this.db.collection('users').add(userToSave);

方法2:用Object.assign创建扩展后的用户对象

如果你想复用你定义的扩展接口,可以用Object.assign把firebase.User的属性拷贝到一个新对象里,再添加自定义字段——新对象是普通JS对象,所有属性都是可枚举的,序列化不会丢:

// 你的扩展接口
export interface CustomUser extends firebase.User {
  points?: number;
}

// 合并原有属性和自定义字段
const customUser: CustomUser = Object.assign({}, user, { points: 1 });

// 存入集合
this.db.collection('users').add(customUser);

方法3:先转普通对象再添加自定义字段

如果一定要用JSON序列化的方式,先把firebase.User转成普通JS对象,再添加自定义字段,这样新属性会被正常序列化:

// 先把firebase.User转成普通对象
const plainUser = JSON.parse(JSON.stringify(user));
// 添加自定义字段
plainUser.points = 1;
// 存入Firestore
this.db.collection('users').add(plainUser);

不过这种方法可能会丢失firebase.User里一些不可枚举但你需要的字段,所以还是前两种方法更稳妥。

对比你的临时方案:先存再更新虽然能实现需求,但多了一次Firestore写操作,不仅效率低,还可能因为网络问题导致数据不一致(比如存成功了但更新失败),所以更推荐上面的一次性写入方案。

内容的提问来源于stack exchange,提问作者今際のアリス

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:57:57