【问题标题】:FirestoreDataConverter throws error for Admin SDK but not for JavaScript or NodeJS as clientFirestoreDataConverter 为 Admin SDK 引发错误,但不为 JavaScript 或 NodeJS 作为客户端
【发布时间】:2020-07-31 04:59:04
【问题描述】:

我有一个包含模型类的 TypeScript 文件。这个模型类映射我的 Firestore 中的文档。该类可以具有以下字段:

class MyObject {

  myName: string;
  myAge: number;
  myFriends: Array<string>

  // contructor
}

Firebase API 提供 FirebaseDataConverter 来转换该类对象中的文档数据,反之亦然。我将此添加到我的模型类中:

class MyObject {

  //...

  static firestoreConverter: firebase.firestore.FirestoreDataConverter<MyObject> = {

    toFirestore: function (myObject: MyObject): firebase.firestore.DocumentData {
      return JSON.parse(JSON.stringify(myObject));
    }

    fromFirestore: function (snapshot: firebase.firestore.QueryDocumentSnapshot<MyObject>, options: firebase.firestore.SnapshotOptions): MyObject {
            let docData = snapshot.data(options);
            let data = JSON.parse(JSON.stringify(docData));
            // call constructor with fields from data
            return new MyObject(...);
    }
  }
}

现在我可以将此转换器添加到集合引用中:

import * as firebase from 'firebase';

// initialize firebase etc.

const firestore = firebase.firestore();
const myCollectionRef = firestore.collection("MyCollection").withConverter(MyObject.firestoreConverter);

通过这种机制,我可以直接检索 MyObjects,而不必在每次读取、写入等时解析它们。

到目前为止,这适用于 JavaScript Web 库。我现在想将此机制与 Admin SDK 一起使用。首先一切似乎都很好:

import * as admin from "firebase-admin";

// initialize firebase etc.

const firestore = admin.firestore();
const myCollectionRef = firestore.collection("MyCollection").withConverter(MyObject.firestoreConverter);

但如果我得到一个文档并尝试使用doc.data() 访问内容,它会显示Type 'unknown' is not assignable to type 'MyObject'.

myCollectionRef.doc("myId").get().then(snapshot => {
  let myObject: MyObject = snapshot.data();
});

有谁知道我必须更改什么才能接收MyObject 而不是unknown

编辑

它似乎不受here 所述的支持。切换“Web”以查看 JavaScript 示例。切换“Node.js”以查看它只使用纯 JavaScript 对象。我仍然想知道为什么这是不可能的。 Firestore 对象不是同类型吗?!

【问题讨论】:

    标签: typescript firebase google-cloud-firestore


    【解决方案1】:

    目前我可以手动执行 FirestoreDataConverter 所做的事情,但我希望 Admin SDK 将来会支持 FirestoreDataConverter

    myCollectionRef.doc("myId").get().then(snapshot => {
      let data = snapshot.data();
      let myObject = new MyObject(/* data fields ... */);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 2013-10-07
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      相关资源
      最近更新 更多