首页 > 解决方案 > 使用无效数据调用 Firestore 函数 DocumentReference.update()。不支持的字段值:自定义对象

问题描述

我正在遵循Firebase 的说明,我的功能如下:

import { DataSource, DataSourceConfig } from "apollo-datasource";
import { KeyValueCache } from "apollo-server-caching";
import firebase from "firebase";
import admin from "firebase-admin";
import "@firebase/firestore";
import { Request } from "apollo-server-env";


export class FirebaseDataSource<TContext = any> extends DataSource {
  context!: TContext;
  db: firebase.firestore.Firestore;

  constructor({
    firebaseConfig,
    serviceAccount,
    databaseURL,
  }: {
    serviceAccount: any;
    firebaseConfig: firebase.app.App;
    databaseURL: string;
  }) {
    super();

    this.context;

    if (!firebase.apps.length) {
      firebase.initializeApp(firebaseConfig);
    }

    if (!admin.apps.length) {
      admin.initializeApp({
        credential: admin.credential.cert(serviceAccount),
        databaseURL,
      });
    }

    if (!this.db) {
      this.db = firebase.firestore();
    }

  }

  async initialize(config: DataSourceConfig<TContext & { request: Request }>) {
    this.context = config.context;
  }

  async user_updateRestaurantFavorites(data: {
    uid: string;
    someId: string;
    add: boolean;
  }) {
    const collectionRef = this.db.collection("users");
    const documentRef = collectionRef.doc(data.uid);
    let favorites;
    if (data.add) {
      favorites = await documentRef.update({
        favorites: admin.firestore.FieldValue.arrayUnion(
          data.someId
        ),
      });
    } else {
      favorites = await documentRef.update({
        favorites: admin.firestore.FieldValue.arrayRemove(
          data.someId
        ),
      });
    }
    return favorites;
  }
}

export default FirebaseDataSource;

我对其进行了调试,并且确实通过了uid,addsomeId正确的。 someId是一个字符串并且add是一个布尔值 (true)

当我运行它时,我得到:

使用无效数据调用 Firestore 函数 DocumentReference.update()。不支持的字段值:自定义对象(在文档用户/XXXXXXX 的字段收藏夹中找到)

我只是用一个简单的字符串运行他们自己的函数。

下面是我的 Firestore 的图像,显​​示用户记录确实有一个空数组准备好接受字符串

我究竟做错了什么?在此处输入图像描述

标签: javascriptnode.jsfirebasegoogle-cloud-firestore

解决方案


您正在混合 Web 客户端和管理客户端 SDK。调用 firebase 导出的方法时,不能使用FieldValuefirebase-admin 导出的对象。错误消息来自 Web 客户端 SDK,它有效地告诉您您传递了一个它不理解的对象(来自 Admin SDK)。

您应该选择其中一个,并完全删除您不使用的那个,以避免出现问题。如果它在后端运行,您应该只使用 Firebase Admin SDK,并完全跳过网络客户端。如果您这样做,您将需要this.db使用管理 SDK 进行分配,可能是this.db = admin.firestore().


推荐阅读