如何在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,提问作者今際のアリス
相关产品推荐
相关产品推荐

