【问题标题】:Firebase onSnapshot in react error, "Expected type 'bc', but it was: a custom he object"Firebase onSnapshot 反应错误,“预期类型'bc',但它是:一个自定义对象”
【发布时间】:2021-12-28 14:27:41
【问题描述】:

我正在关注本教程https://www.sitepoint.com/reddit-clone-react-firebase/

之前很简单,只是在获取文档后调用 onSnapshot,但这里它是一个单独的函数,现在问题来了,当我尝试通过传递文档来调用 onSnapshot 时,它总是说,不管我试图将什么类型的数据作为第一个参数传递,它总是说,它不是它所期望的“bc”类型。

FirebaseError:预期类型为“bc”,但它是:自定义 he 对象

useEffect(async () => {

        const postsCollection = collection(db, "posts");
        const orderedCollection = query(
            postsCollection,
            orderBy("createdAt", "desc")
        );        
        try {
            onSnapshot(
                orderedCollection, // here I think the problem is!
                (querySnapshot) => {
                    console.log("yahaan se problem hai");
                    console.log(querySnapshot);
                    const _posts = [];

                    querySnapshot.forEach((doc) => {
                        console.log(doc);
                        _posts.push({
                            id: doc.id,
                            ...doc.data(),
                        });
                    });
                    console.log(_posts);

                    // setPosts(_posts);
                },
                (error) => {
                    console.log("error occured: ", error);
                },
                () => {
                    console.log("completed");
                }
            );
        } catch (e) {
            console.log("ye kya drama hai:", e);
        } finally {
            console.log("finally");
        }
    }, []);

【问题讨论】:

  • 您是否尝试过参考教程中的确切示例?我相信做db.collection("posts").orderBy("createdAt", "desc").onSnapshot((querySnapshot) => 应该有效。你也可以看到这个Firebase documentation
  • 不,因为本教程使用的是旧版本的 firebase,所以,我使用的是较新/最新的版本,而最新版本有不同的方法,这就是造成问题的原因.
  • 您的 Firebase 版本是多少?我相信这个SO 线程的答案可能会有所帮助。
  • 我正在使用“firebase”:“^9.6.1”,我尝试了该线程中提到的代码,但我仍然遇到同样的错误,但这次它说“自定义他对象”而不是“自定义文件对象”

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

好的,所以我遇到了同样的问题,在与最新版本的 firebase 斗争了一段时间后,我找到了解决方案。 我不知道你使用的是类组件还是函数式组件,在这个例子中我使用的是一个函数式组件,但我认为如果你替换反应钩子它会一样工作。

import { getFirestore, collection } from 'firebase/firestore'

const db = getFirestore();
const colRef = collection(db, "team") 
   
const [results, setResults] = useState([]);
        useEffect(() => { 
            let isMounted = true; 
                    onSnapshot(colRef, (snapshot) => { 
                    if (isMounted) {
                    const results= snapshot.docs.map((doc) => {return {...doc.data(), id: doc.id}});
                    setResults(results) 
                    }
                });   
            
            return () => { isMounted = false };
        }, []);

这样,您的组件将在每次数据更改时侦听更新,之后您可以使用查询对其进行个性化设置,但我想向您展示一个简单的示例,以便于理解。

【讨论】:

  • 天!伙计,这就像魅力一样,非常感谢,我想我应该忘记解决这个问题,非常感谢,现在我得到了这个错误的真正原因,我所做的导入是错误的。正如您在答案中提到的,所有这些功能都来自 firesbase/firestore。我尝试使用我的代码,但遇到了同样的错误,然后我从 firebase/firestore 导入了所有查询、集合、orderBy,它起作用了!
【解决方案2】:

这类错误通常发生在函数没有按应有的方式使用时。我无法确定代码中的问题出在哪里,但您可以尝试使用 getDocs 方法和 state variable 来存储您的值

试试这个代码。

const [Results, setResults] = useState([]);
useEffect(() => {

const FetchedPosts = async () => {
    const querySnapshot = await getDocs(
    collection(db, 'posts'),
    orderBy("createdAt", "desc")
    );
    querySnapshot.forEach((doc) => {
    
        setResults((prevState) => [...prevState, doc.data()]);
    
    });
};

FetchedPosts();
}, []);

【讨论】:

  • getDocs 方法只检索一次数据,而 onSnapshot 设置一个侦听器并观察数据更改,因此它们不是相同的方法。我尝试将你的逻辑与 onSnapshot 一起使用,但我仍然遇到与匿名程序员相同的错误。
  • 正如@alexgarciaalcuadrado 所说,我想在有任何变化时获取数据。而且onSnapshot做得很好,但我无法实现。
猜你喜欢
  • 2022-01-02
  • 2022-01-05
  • 2022-07-05
  • 2022-06-10
  • 2023-01-10
  • 1970-01-01
  • 2019-12-19
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多