开发者问题收集

React Native w/firebase“未定义不是一个对象”

2020-08-17
910

收到此错误:

TypeError: undefined is not an object (evaluating 'doc.data().books')

来自此代码:

const getData = () => {
        const snapshot = db.collection('users').doc(userEmail).onSnapshot((doc) => {
            setData(doc.data().books)
        })

    }

    useEffect(() => {
        getData()
    }, [])

这是 firestore 数据库,尝试获取更新的 boo 集合(显示在平面列表中,当新内容添加到集合时需要更新)请注意,有一个用户集合不在屏幕上。

在此处输入图像描述 我很确定这是我在快照上做错的事情,但我真的不确定是什么,非常感谢所有的帮助 :)

3个回答

错误告诉您 doc.data() 返回了未定义,这意味着您请求的文档不存在。您可能为 userEmail 传递了一个您预期以外的值。由于您没有显示该值,我们无法确定出了什么问题。

我要指出的是,文档 ID 必须完全匹配,因此如果电子邮件地址不是“ [email protected] ”且大写 E,则查询将不会返回使用您在此处显示的内容的文档。

Doug Stevenson
2020-08-17

有几种可能。但是,db 未在 getData 函数范围内定义...它在哪里定义?

Jose Cabrera Zuniga
2020-08-17

如果我正确理解了您的问题,您想要获取 id 对应于 userEmail 的用户文档的 books (或 boo ?)子集合中的文档。

如果这个假设正确,您应该执行以下操作:

const getData = () => {
    db.collection('users').doc(userEmail).collection('books')
       .onSnapshot(querySnapshot => {
           var books = [];
           querySnapshot.forEach(doc => {
               books.push(doc.data());
           });
           // Here you have an array of all the book objects.
           // It's up to you to use it as you wish with your setData() function
       });

}

请注意,使用 doc.data().books 您实际上是在尝试获取用户文档的 books 字段。

Renaud Tarnec
2020-08-17