【发布时间】:2021-01-01 14:55:35
【问题描述】:
我关注Firebase's instructions,我的功能如下:
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()。不支持的字段值:自定义对象(在文档 users/XXXXXXX 的字段收藏夹中找到)
我只是用一个简单的字符串运行自己的函数。
下面是我的 firestore 的图像,显示用户记录确实有一个空数组准备好接受字符串
【问题讨论】:
-
您是否在云函数中执行此代码(您调用
admin.firestore.FieldValue.arrayUnion)? -
请编辑问题以显示导致问题的完整、最少的代码。尤其是你为分配
this.db所做的事情。 -
@DougStevenson,已更新。请注意,我是通过 Apollo Server 触发的
-
@RenaudTarnec,确实如此。通过我的本地主机 apollo 服务器运行的云功能。
标签: javascript node.js firebase google-cloud-firestore