我正在尝试使用 arrayUnion 使用 React 和节点 Firebase SDK(不是管理 SDK)更新 firestore 中的数组,但出现错误:
<块引用>FirebaseError:使用无效数据调用函数 DocumentReference.update()。不支持的字段值:未定义(在文档 usernames/tester/projects/default 中的字段 requestID 中找到)
在我的一生中,我一直无法弄清楚为什么会出现此错误,因为我的代码将在不使用 arrayUnion 的情况下更新值,因此它正在定位该位置。我已经尝试了其他类似的问题,但没有得到解决。
一些代码: firebase.js
import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
import 'firebase/storage';
const firebaseConfig = {
apiKey: xxxx,
authDomain: "xxxx.firebaseapp.com",
projectId: "xxxxx",
storageBucket: "xxxxx.appspot.com",
messagingSenderId: "xxxxx",
appId: "xxxxxx",
measurementId: "xxxxxx"
};
// initialize Firebase
if (!firebase.apps.length)
{
firebase.initializeApp(firebaseConfig);
}
else
{
firebase.app(); // if already initialized, use this one
}
export const auth = firebase.auth()
export const firestore = firebase.firestore();
export default firebase
export const storage = firebase.storage();
export const serverTimestamp = firebase.firestore.FieldValue.serverTimestamp;
export const arrayUnion=(data) =>{
firebase.firestore.FieldValue.arrayUnion(data);
}
export const TimestampToDate = firebase.firestore.Timestamp.toDate;
commissions.services.js 文件
import { firestore, arrayUnion } from "../firebase";
// get ref to projects
const getProjectRef = (username) =>{
return firestore.collection('usernames').doc(username).collection('projects').doc('default');
};
// add docID to requestIDs array
const updateProjectColumns= (id, username ) =>{
return getProjectRef(username).update({'requestIDs': arrayUnion(id)});
}
const CommissionService = {
updateProjectColumns
};
export default CommissionService;
ButtonRequest.js
import CommissionService from '../../services/commissions.service';
// relevant code
const handleClick = () => {
CommissionService.updateProjectColumns(props.docID, props.requestData.data().commissionedArtist);
};
我的 CommissionService.updateProjectColumns 是问题所在。道具正在工作,如果我用一个测试字符串代替 [arrayUnion(id)] 部分,它将更新文档,只是删除已经存在字符串的数组。
Firestore 上的所有文档都说这是使用 arrayUnion 函数的方法。即使该字段值不是数组,根据文档,该函数也应使其成为仅包含附加值的数组。
firestore 中的示例文档
requestIDs: [
"test String"
]
文档在这里:https://firebase.google.com/docs/firestore/manage-data/add-data?authuser=2#node.js_11
我能看到的唯一区别是我没有使用管理 SDK,但客户端 SDK 中的功能似乎相同。任何帮助将不胜感激。
答案 0 :(得分:0)
可能是因为:
export const arrayUnion=(data) =>{
firebase.firestore.FieldValue.arrayUnion(data);
}
...没有返回语句。所以我想你想要...
export const arrayUnion=(data) =>{
return firebase.firestore.FieldValue.arrayUnion(data);
}
概括(如果 data
有多个值,如数组),您可能想要这样做:
export const arrayUnion=(data) =>{
return firebase.firestore.FieldValue.arrayUnion(...data);
}