【问题标题】:Firestore arrayUnion returns FirebaseError: Function DocumentReference.update() called with invalid dataFirestore arrayUnion 返回 FirebaseError:使用无效数据调用的函数 DocumentReference.update()
【发布时间】:2023-03-24 01:46:01
【问题描述】:

我正在尝试使用 arrayUnion 使用 React 和节点 Firebase SDK(不是管理员 SDK)更新 firestore 中的数组,但我收到一条错误消息:

FirebaseError:使用无效数据调用函数 DocumentReference.update()。不支持的字段值:未定义(在文档 usernames/tester/projects/default 的字段 requestIDs 中找到)

在我的一生中,我一直无法弄清楚为什么会出现此错误,因为我的代码将在不使用 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 中的功能似乎相同。任何帮助将不胜感激。

【问题讨论】:

    标签: reactjs firebase google-cloud-firestore


    【解决方案1】:

    可能是因为:

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

    【讨论】:

    • 你这个了不起的人!我花了几个小时试图解决这个问题!我确实尝试了通用解决方案,但由于数据是一个字符串,它 (...data) 将解析字符串中的每个字母并将它们作为元素添加到数组中。 (数据)按预期工作得很好,非常感谢。
    猜你喜欢
    • 2021-02-24
    • 2021-06-12
    • 2022-07-20
    • 2021-01-01
    • 2021-08-29
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多