首页 > 解决方案 > 未处理的拒绝 (FirebaseError):使用无效数据调用函数 DocumentReference.update()。不支持的字段值:自定义对象

问题描述

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.1/umd/react-dom.production.min.js"></script>
import React, { useRef } from "react";
import firebase from "../api/firebase";
import admin from "firebase-admin";

export default function ListItem(props) {
  const commentRef = useRef();

  const addCommentHandler = async () => {
    const comment = commentRef.current.value;
    const db = firebase.firestore();
    // const jajaja = await db.collection("userData").doc(`${props.id}`).get();
    // console.log(jajaja.data().comments.length);
    const init = db.collection("userData").doc(`${props.id}`);

    const init2 = await init.update(
      { comments: admin.firestore.FieldValue.arrayUnion(`${comment}`) },
      {
        merge: true,
      }
    );
  };

  return (
    <>
      <li onClick={props.onClick}>{props.email}</li>
      <input type="text" ref={commentRef} />
      <button onClick={addCommentHandler}>Add Comment</button>
    </>
  );
}

我一直把标题当作错误。我究竟做错了什么?另外,这是我的数据库的快照。我已经在 firestore 中添加了一条评论,并且正在尝试添加更多“评论”数组项。 这是我的云 Firestore 数据库。 我正在尝试在我的评论数组中添加新评论

这是使用 set() 而不是 update() 后的错误

在此处输入图像描述

标签: javascriptarraysreactjsgoogle-cloud-firestore

解决方案


你正在传递{merge: true}. .update()当您知道文档存在时使用更新方法,否则它将返回错误。

const init2 = await init.set(
      { comments: admin.firestore.FieldValue.arrayUnion(`${comment}`) },
      {
        merge: true,
      }
    );

您可能正在寻找.set(). 如果不存在,它将创建一个文档,但会更新现有文档而不覆盖其他字段。

如果您知道文档存在,最好的方法是使用更新,它看起来像:

const init2 = await init.update({ comments:admin.firestore.FieldValue.arrayUnion(`${comment}`) }

再次注意,使用更新时不需要传递合并选项。


推荐阅读