FirestoreDataConverter выдает ошибку для Admin SDK, но не для JavaScript или NodeJS в качестве клиента - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть файл TypeScript, который содержит класс модели. Этот класс моделей отображает документы в моем Firestore. Класс может иметь следующие поля:

class MyObject {

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

  // contructor
}

API Firebase предлагает 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 и не должен анализировать их каждый раз, когда я читаю, пишу и т. д. c. их.

До сих пор это работало нормально для веб-библиотеки JavaScript. Я хочу использовать этот механизм сейчас с 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?

РЕДАКТИРОВАТЬ

Кажется, что он не поддерживается, как описано здесь . Переключите «Сеть», чтобы увидеть пример JavaScript. Переключите 'Node.js', чтобы увидеть, что он просто использует простые JavaScript объекты. Я до сих пор удивляюсь, почему это невозможно. Разве объект Firestore не имеет такой же тип?!

1 Ответ

0 голосов
/ 17 апреля 2020

Пока я могу вручную делать то, что делает FirestoreDataConverter, но я надеюсь, что Admin SDK будет поддерживать FirestoreDataConverter в будущем.

myCollectionRef.doc("myId").get().then(snapshot => {
  let data = snapshot.data();
  let myObject = new MyObject(/* data fields ... */);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...