javascript - 使用无效数据调用 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
,add
和someId
正确的。
someId
是一个字符串并且add
是一个布尔值 (true)
当我运行它时,我得到:
使用无效数据调用 Firestore 函数 DocumentReference.update()。不支持的字段值:自定义对象(在文档用户/XXXXXXX 的字段收藏夹中找到)
我只是用一个简单的字符串运行他们自己的函数。
下面是我的 Firestore 的图像,显示用户记录确实有一个空数组准备好接受字符串
解决方案
您正在混合 Web 客户端和管理客户端 SDK。调用 firebase 导出的方法时,不能使用FieldValue
firebase-admin 导出的对象。错误消息来自 Web 客户端 SDK,它有效地告诉您您传递了一个它不理解的对象(来自 Admin SDK)。
您应该选择其中一个,并完全删除您不使用的那个,以避免出现问题。如果它在后端运行,您应该只使用 Firebase Admin SDK,并完全跳过网络客户端。如果您这样做,您将需要this.db
使用管理 SDK 进行分配,可能是this.db = admin.firestore()
.
推荐阅读
- python - 如何在 python 中转换字符串以获取 ASCII 数字?
- symfony - @Route - 如何确保学说也检查父实体
- postgresql - Spring Batch Processing - Postgresql 共享内存不足
- c# - Android(Xamarin)如何通过蓝牙从手环获取数据(脉冲)
- excel - Excel:如果列表中存在则突出显示单元格
- node.js - socket.io 随机聊天室一对一
- php - STFP 连接和下载混淆
- python-3.x - 从带有图像的扫描pdf中提取文本?
- java - JavaFX 11 OpenJDK 模块-info.java
- math - Octave 的 power operator 的确切问题是什么?