FirebaseError:使用无效数据调用函数 addDoc()。不支持的字段值:未定义

Pri*_*S S 5 javascript firebase reactjs redux google-cloud-firestore

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("")
    }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当我尝试运行该函数时,出现下图中的错误。我尝试过使用 google cloud firestore 的时间戳作为替代方案,但我不知道这有什么问题。

Ren*_*nec 5

name该错误消息表明您传递给该方法的对象的属性值add()未定义。

\n

这个值是,正如您将在文档user.displayName中看到的,您应该“确保 Auth 对象不处于中间状态 \xe2\x80\x94,例如在获取当前用户时初始化\xe2\x80\x94” 。

\n

为此,您可以使用onAuthStateChanged()观察者并将所需的业务逻辑放入块中if (user) {},如文档中所示,或者,您firebase.auth().currentUser在执行之前手动检查该逻辑是否不为空user.displayName

\n