Firestore:向db添加自定义对象

Coa*_*ach 15 firebase angularfire2 angular google-cloud-firestore

早上好,

我尝试从这个类中添加一个新创建的对象:

export class Sponsor implements ISponsor {

  title: string;    
  description?: string;
  creation: ICreation;

  constructor(title: string, description: string, author: string) {
     this.title = title;
     this.description = description;
     this.creation = new Creation(author);
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的服务中,create函数看起来像:

createSponsor(sponsor) {
   sponsor.id = this.afs.createId();
   return this.collection.doc(sponsor.id).set(sponsor);
}
Run Code Online (Sandbox Code Playgroud)

当我这样尝试时,我收到以下错误:

FirebaseError:[code = invalid-argument]:函数DocumentReference.set()使用无效数据调用.数据必须是一个对象,但它是:一个自定义的赞助商对象

我该如何解决这个问题?

小智 24

您也可以使用Object.assign({},赞助商)

所以在你的情况下它会是

this.collection.doc(sponsor.id).set(Object.assign({}, sponsor));
Run Code Online (Sandbox Code Playgroud)

  • 这可以正常工作,但是您应该注意`Object.assign`对于深度克隆不起作用。 (2认同)
  • 不适合嵌套对象 (2认同)

小智 8

您还可以将对象序列化为JSON并将其反序列化为常规JavaScript对象

this.collection.doc(sponsor.id).set(JSON.parse( JSON.stringify(sponsor)));
Run Code Online (Sandbox Code Playgroud)

适用于深层嵌套.

  • 这将在保存到 firestore 时破坏时间戳对象。 (2认同)

Coa*_*ach 6

感谢 Fabian Wiles - 我明白了!

虽然 firebase 可以将对象内的数据发送到数据库,但当数据返回时,它无法将其实例化回类的实例中。因此不允许上课

只需像这样保存一个对象:

interface Person{
  name: string;
  age: number
}

var person: Person = { name: 'Toxicable', age: 22} ;
Run Code Online (Sandbox Code Playgroud)


Jür*_*ter 6

Firestore 不支持。但是你可以使用https://github.com/typestack/class-transformer 它对我们来说非常好。