【问题标题】:Firebase withConverter throws an error when used in Admin SDK but not in firestore clientFirebase withConverter 在 Admin SDK 中使用时抛出错误,但在 Firestore 客户端中没有
【发布时间】:2022-06-13 19:40:37
【问题描述】:

当我从 firestore 获取数据时,我正在尝试使用我们在客户端代码中使用的现有转换器,客户端转换器可以工作,但是当我尝试在管理 SDK 上使用它时,它会抛出一些令人困惑的类型错误:

客户端代码(工作)

async function getUser() {
  const db = getFirestore(); // from '@firebase/firestore'
  const userSnap = await getDoc(
    doc(db, 'users/Vl7vMV6AIrUFRL9iFkCWN8tgaXE2').withConverter(
      aphexUserConverter
    )
  );

  if (!userSnap.exists()) {
    return null;
  }

  const user = userSnap.data();

  return user;
}

服务器端/管理 SDK(错误)

async function getUser() {
  const db = admin.firestore(); // from 'firebase-admin'
  const snap = await db
    .collection('users')
    .doc('Vl7vMV6AIrUFRL9iFkCWN8tgaXE2')
    .withConverter(aphexUserConverter)
    .get();

  if (!snap.exists) {
    return null;
  }

  const user = snap.data();

  return user;
}

错误截图

转换器

const aphexUserConverter: FirestoreDataConverter<AphexUser> = {
  toFirestore(data: PartialWithFieldValue<AphexUser>): DocumentData {
    const user: PartialWithFieldValue<AphexUser> = {};

    if ('id' in data) {
      user.id = data.id;
    }

    if ('email' in data) {
      user.email = data.email;
    }

    if ('displayName' in data) {
      user.displayName = data.displayName;
    }

    if ('color' in data) {
      user.color = data.color;
    }

    if ('avatarUrl' in data) {
      user.avatarUrl = data.avatarUrl;
    }

    if ('status' in data) {
      user.status = data.status;
    }

    if ('jobTitle' in data) {
      user.jobTitle = data.jobTitle;
    }

    if ('phoneNumber' in data) {
      user.phoneNumber = data.phoneNumber;
    }

    if ('providerIds' in data) {
      user.providerIds = data.providerIds;
    }

    return user;
  },
  fromFirestore: (
    snap: QueryDocumentSnapshot,
    options: SnapshotOptions
  ): AphexUser => {
    const data = snap.data(options);

    const user: AphexUser = {
      id: snap.id,
      color: data.color,
      email: data.email,
      status: data.status,
      jobTitle: data.jobTitle,
      avatarUrl: data.avatarUrl,
      displayName: data.displayName,
      phoneNumber: data.phoneNumber,
      providerIds: data.providerIds,
    };

    return user;
  },
};

有人知道解决办法吗?我似乎无法使用打字稿在线找到其他示例。

【问题讨论】:

    标签: node.js typescript firebase google-cloud-firestore converters


    【解决方案1】:

    我已经复制了您的案例,并且 FirestoreDataConverter 对 Admin SDK 运行良好。也许您没有从

    中获取代码示例

    https://googleapis.dev/nodejs/firestore/latest/global.html#Fires toreDataConverter (Admin SDK -> Node.js -> firebase-admin/firestore->firestoreDataConverter) 但在这里 https://firebase.google.com/docs/reference/node/firebase.firestore.FirestoreDataConverter (Node.js 客户端 -> firebase.firestore -> firebaseDataConverter)

    下面是功能代码:

    **index.ts**
    
    import { initializeApp, getApp } from 'firebase-admin/app';
    import { getFirestore } from 'firebase-admin/firestore';
     
    initializeApp();
    const app = getApp();
    const db = getFirestore(app);
    class Post {
       constructor(readonly title: string, readonly authr: number) { }
       toString(): string {
           return this.title + ', by ' + this.authr;
       }
    }
    const postConverter = {
       toFirestore(post: Post): FirebaseFirestore.DocumentData {
           return { title: post.title, author: post.authr };
       },
       fromFirestore: (
           snapshot: FirebaseFirestore.QueryDocumentSnapshot
       )=>{
       const data = snapshot.data();
           return new Post(data.title, data.authr);
       }
    };
    db.collection('users')
       .withConverter(postConverter)
       .doc("101").get().then((postSnap) => {
           const post = postSnap.data();
           if (post !== undefined) {
               post.title; // string
               post.toString(); // Should be defined
               console.log(post.toString());
               //post.someNonExistentProperty; // TS error
           }
       })
    
    **package.json**
    
    {
     "dependencies": {
       "firebase-admin": "^10.3.0"
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 2021-11-08
      • 2021-06-23
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多