我一直在创建一个Angular2应用程序,我想在Firebase中更新用户的个人资料,我使用的是AngularFire2。
例如,当我尝试更新具有密钥" nmH5ZmawpQgogoCRVFVfNaBN6xg1"的用户个人资料时,当我点击按钮进行更新时,会出现错误
EXCEPTION: Error in ./ProfilComponent class ProfilComponent - inline template:82:10 caused by: Firebase.update failed: First argument contains a function in property 'users.nmH5ZmawpQgogoCRVFVfNaBN6xg1.$exists' with contents: function () {
return snapshot.exists();
}
user.service.ts
users:FirebaseListObservable<any>;
updateUser(user:IUser){
this.users=this.af.database.list('/users');
this.users.update(user.uid,user);
}
user.ts
export interface IUser {
avatarUrl:string;
createdDate:string;
birthDate:string;
displayName:string;
email:string;
gendre:string;
interests:Interest[];
job:Job[];
location:ILocation;
plateform:string;
uid:string;
}
提前致谢。
答案 0 :(得分:1)
在AngularFire2中,列表项和对象具有$key
属性并添加了$exists
函数。请参阅unwrapMapFn
实用程序功能。
从版本2.0.0-beta.8
开始,$key
和$exists
属性应该是不可枚举的,update
实现应该忽略这些属性。
如果您不想将AngularFire2依赖项更新为最新版本,可以使用以下方法:
updateUser(user: IUser) {
const { $exists, $key, ...userWithout$ } = user as any;
this.users = this.af.database.list('/users');
this.users.update(user.uid, userWithout$);
}
但是,最近发布的版本中有一些错误修复,因此鼓励进行更新。
答案 1 :(得分:0)
简而言之:您在更新的第二个参数中放入的对象可能不包含属性$ key和$ exists:
const key = user.uid;
let userWithout$ = user;
delete userWithout$.$key;
delete userWithout$.$exists;
this.users.update(key, userWithout$);
顺便说一句:额外的问题:
解构线@cartant使用:
const { $exists, $key, ...userWithout$ } = user as any;
非常好但在我的情况下没有工作并导致以下错误:预期的属性解构模式。
这是ES6语法,应该可以正常工作。 我使用的是typescript 2.4.1。 我的tsconfig.json可能有问题吗? (我的项目的ts编译目标必须是es5)。