Firebase错误:使用无效数据调用addDoc()函数。不支持的字段值:undefined。

5
function Chat() {
    const [input, setInput] = useState("")
    const [seed, setSeed] = useState("")
    const {personid} = useParams()
    const [personname, setPersonname] = useState("")
    const [messages, setMessages] = useState([])
    const [{user}, dispatch] = useStateValue()

    useEffect(() => {
        if (personid) {
        db.collection("people")
        .doc(personid)
        .onSnapshot((snapshot) => 
            setPersonname(snapshot.data().name));

        db.collection("people")
        .doc(personid)
        .collection("messages")
        .orderBy("timestamp", "asc")
        .onSnapshot((snapshot) => 
            setMessages(snapshot.docs.map(doc =>doc.data()))
            )
        }
    }, [personid])

    useEffect(() => {
        setSeed(Math.floor(Math.random()*1000))
    }, [personid])

    const sendmessage = (e) => {
        e.preventDefault()
        console.log("The input is ", input);
        
        db.collection("people").doc(personid).collection("messages").add({
            message: input,
            name: user.displayName,
            timestamp: firebase.firestore.FieldValue.serverTimestamp(),
        })

        setInput("")
    }

在此输入图片描述

当我尝试运行该函数时,出现了下面图片中的错误。我已经尝试使用谷歌云firestore的时间戳作为替代方案,但我不知道问题出在哪里。


首先,我没有看到实际调用 addDoc 的代码。但我猜测当您调用 .doc(personid) 时,在第48行时,也许 personid 是未定义的?检查该值以及该方法的文档,以查看您是否正确使用该方法。 - Lucas
我没有编写调用addDoc的代码,这就是为什么我感到困惑。此外,在添加第16-23行之前,personid并不是未定义的,因为它之前完美地工作了。 - Priyadarsh S S
请在您的问题中添加错误消息作为文本,以便其他人可以通过搜索引擎找到它。 - Renaud Tarnec
下次我一定会这样做。错误出在 user.displayName 上。谢谢。 - Priyadarsh S S
2个回答

5
错误信息表明,您在将对象传递给 add() 方法时,传递的对象的 name 属性的值为未定义。
该值为 user.displayName,如文档中所示,您应该“确保在获取当前用户时,Auth 对象不处于中间状态(例如初始化)”。
为此,您可以使用 onAuthStateChanged() 观察器,并将所需的业务逻辑放入 if (user) {} 块中,如文档中所示,或者,在执行 user.displayName 之前,手动检查 firebase.auth().currentUser 不为空。

0
对我来说,用户没问题。 我发现没有任何区别,但这解决了问题。

function postToFirebase(origObj) {
  let string = JSON.stringify(origObj);
  let newObj = JSON.parse(string);

  doc(db, collection, newObj)
}

我知道,这很奇怪,但是有效...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接