javascript - 未处理的拒绝 (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 中添加了一条评论,并且正在尝试添加更多“评论”数组项。
这是使用 set() 而不是 update() 后的错误
解决方案
你正在传递{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}`) }
再次注意,使用更新时不需要传递合并选项。
推荐阅读
- flutter - 登录界面背景flutter video_player带来黑屏
- laravel - 在覆盖的用户表上注册时 Laravel 6.5.2 错误
- opengl - GPU内部的OpenGL像素传输
- kubernetes - 如何在 Kubernetes 中删除复制控制器及其 pod?
- python - 不修改调用实例
- node.js - 如何访问我的角度应用程序以重定向到节点 js 服务器使用 res.redirect() 重定向的特定 URL
- c# - Response.BinaryWrite() 方法的 Veracode 扫描 XSS 问题
- html - 内联 SVG 矩形可以自动关闭吗?
- active-directory - 将 LDAP 查询的范围扩大到 Active Directory
- node.js - 使用中间件进行 Websockets 令牌身份验证并在 node.js 中表达