Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用无效数据调用Firestore函数DocumentReference.update()。不支持的字段值:自定义对象_Javascript_Node.js_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 使用无效数据调用Firestore函数DocumentReference.update()。不支持的字段值:自定义对象

Javascript 使用无效数据调用Firestore函数DocumentReference.update()。不支持的字段值:自定义对象,javascript,node.js,firebase,google-cloud-firestore,Javascript,Node.js,Firebase,Google Cloud Firestore,我的职责如下: import { DataSource, DataSourceConfig } from "apollo-datasource"; import { KeyValueCache } from "apollo-server-caching"; import firebase from "firebase"; import admin from "firebase-admin"; import "

我的职责如下:

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;
从“阿波罗数据源”导入{DataSource,DataSourceConfig};
从“apollo服务器缓存”导入{KeyValueCache};
从“firebase”导入firebase;
从“firebase管理员”导入管理员;
导入“@firebase/firestore”;
从“阿波罗服务器环境”导入{Request};
导出类FirebaseDataSource扩展了DataSource{
上下文!:t上下文;
db:firebase.firestore.firestore;
建造师({
firebaseConfig,
服务帐户,
数据库URL,
}: {
服务账户:任何;
firebaseConfig:firebase.app.app;
databaseURL:string;
}) {
超级();
这就是背景;
如果(!firebase.apps.length){
firebase.initializeApp(firebaseConfig);
}
如果(!admin.apps.length){
admin.initializeApp({
凭证:管理员凭证证书(serviceAccount),
数据库URL,
});
}
如果(!this.db){
this.db=firebase.firestore();
}
}
异步初始化(配置:DataSourceConfig){
this.context=config.context;
}
异步用户\u UpdateRestaturantFavorites(数据:{
uid:字符串;
someId:字符串;
加:布尔;
}) {
const collectionRef=this.db.collection(“用户”);
const documentRef=collectionRef.doc(data.uid);
让最爱;
if(data.add){
收藏夹=等待documentRef.update({
收藏夹:admin.firestore.FieldValue.arrayUnion(
data.someId
),
});
}否则{
收藏夹=等待documentRef.update({
收藏夹:admin.firestore.FieldValue.arrayRemove(
data.someId
),
});
}
返回收藏夹;
}
}
导出默认FirebaseDataSource;
我对它进行了配音,并正确地传递了
uid
add
someId
someId
是字符串,
add
是布尔值(true)

当我运行此程序时,我得到:

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

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

下面是我的firestore的图片,显示用户记录确实有一个空数组,可以接受字符串


我做错了什么?

Firebase只能存储相同的基元类型、映射和数组。在本例中,您正在为属性
收藏夹
保存
admin.firestore.FieldValue.arrayUnion(…)
的结果


我的猜测是,结果不会返回受支持的类型。我以前没有使用过
FieldValue
。。。这是使用API的正确方法吗?

您混淆了web客户端和管理客户端SDK。调用firebase导出的方法时,不能使用firebase admin导出的
字段值
对象。错误消息来自web客户端SDK,它实际上告诉您传递了一个它不理解的对象(来自AdminSDK)


你应该选择一个或另一个,并完全删除一个你不使用,以避免问题。如果在后端运行,则应仅使用Firebase Admin SDK,并完全跳过web客户端。如果执行此操作,则需要使用admin SDK分配
this.db
,可能是
this.db=admin.firestore()

,这意味着您需要发送查询接收到的确切数据。不允许使用部分对象

db.collection("users").where("name", "==", somename).limit(1).get().then(query => {
                console.log(query);
                const thing = query.docs[0];
                console.log(thing.data());
                let tmp = thing.data();
                tmp.current_game_play = tmp.current_game_play + 1;
                console.log(tmp);
                thing.ref.update(tmp);
            });

您是否在云函数中执行此代码(您调用
admin.firestore.FieldValue.arrayUnion
)?请编辑问题以显示导致问题的完整的最小代码。特别是您为分配
this.db
@DougStevenson所做的操作,已更新。注意,我是通过阿波罗发射的Server@RenaudTarnec是的。通过我的本地主机apollo服务器运行的云功能。我相信arrayUnion会产生Firebase需要存储的任何东西,否则就不会出现在他们的文档中。请参阅我原始问题中的链接。我没看见什么吗?我正在向它传递一个数组,就像他们建议的那样。道格,这对我来说是新的,但很有意义。所以你是说,如果我运行这个函数(以及我没有提到的其他函数)来管理DB条目(CRUD),那么我最好只使用ADMINSDK。正确的?所以我基本上不应该
从“firebase”导入firebase并将每个
firebase.
替换为
管理员。
,当然,还可以设置任何需要设置的内容以正确初始化管理员。我做对了吗?