Firebase await db.collection不进入catch语句,永远等待。

问题描述 投票:0回答:1

我用GatsbyJS和Firebase做了一个小博客。我的博客是静态的,就像通常的Gatsby博客一样,但是我在Firebase上获取评论数据。

以下是我获取评论数据的功能

  //@@@ Fetch Comment Data function
 //function to fetch comment data 

 const fetchData = async () => {

   try {
           console.log("entered try")
           const commentRef = await db.collection("comments").doc(postID).get();
           setComments(commentRef.data().comments);
       } catch (error) {
           console.error(error);
      }
}

事情是这样的,我试图写出一个异常,当一个帖子没有注释的时候,也就是说文档postID不存在,而我的try catch从来没有进入catch块,好像永远卡住了。我在这里想知道这是否是我的async await语法的错误,是我的函数语法的错误,还是我违反了Firestore的特定规则。

如果文档存在,就像我已经通过firebase面板创建了文档一样,这段代码工作正常,没有任何问题。所以我想在捕捉语句中加入,如果这个postID的文档不存在,我可以创建它,或者至少设置状态来显示这个postID没有注释。

谢谢你

javascript firebase async-await try-catch
1个回答
1
投票

来自firebase文档。

下面的例子展示了如何使用get()来获取一个文档的内容:

https:/firebase.google.comdocsfirestorequery-dataget-data。

var docRef = db.collection("cities").doc("SF");

docRef.get().then(function(doc) {
    if (doc.exists) {
        console.log("Document data:", doc.data());
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});

注意:如果在docRef引用的位置没有文档,生成的文档将是空的,调用existence将返回false。

所以 get() 方法永远不会抛出异常,这就是为什么你的捕捉块没有运行的原因.在你的情况下,你会实现你正在做的事情,像这样。

const fetchData = async () => {

const commentRef = await db.collection("comments").doc(postID).get().then(post => {

    try {
        if (!post.exists) {
           throw "Post doesn't exist";
        }
        setComments(post.data().comments);
    } catch (err) {
        console.error(err);
    }

});

}

代码未测试...

© www.soinside.com 2019 - 2024. All rights reserved.