Firestore arrayUnion 返回 FirebaseError:使用无效数据调用函数 DocumentReference.update()

时间:2021-07-08 20:53:11

标签: reactjs firebase google-cloud-firestore

我正在尝试使用 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 中的功能似乎相同。任何帮助将不胜感激。

1 个答案:

答案 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);
}