【问题标题】:Firebase await db.collection does not enter catch statement, awaiting foreverFirebase await db.collection 不进入 catch 语句,永远等待
【发布时间】:2020-09-01 07:50:07
【问题描述】:

我正在使用 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);
      }
}

问题是,我试图写一个帖子何时没有 cmets 的异常,也就是说文档 postID 不存在,而我的 try catch 从未进入 catch 块,似乎它的永远卡住了。我在这里想知道这是否是我的 async await 语法、我的函数语法或我正在打破的 Firestore 特定规则的错误。

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

谢谢

【问题讨论】:

  • 是否调用了setComments 方法?尝试在await方法之后写console.log('foo')
  • setCommments 只是一个 useState 钩子方法,比如这个 const [comments, setComments] = useState([]); 我只是在等待之后做了控制台(“foo”),它实际上显示了所以我继续登录,我登录了commentRef 及其从 firebase 实际返回的内容,即使文档不存在,它也会返回一个空对象。所以这可能是问题所在。也许我应该在 try 块中编写一个 if 语句来检查 commentRef.data() 是否是一个空对象,我应该自己创建文档。但我不太确定。

标签: javascript firebase async-await try-catch


【解决方案1】:

来自 firebase 文档:

以下示例展示了如何使用 get() 检索单个文档的内容:

https://firebase.google.com/docs/firestore/query-data/get-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 引用的位置没有文档,则生成的文档将为空,调用 exists 将返回 false。

所以get() 方法永远不会抛出异常,这就是你的catch 块没有运行的原因。 在您的情况下,您将实现您的目标:

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);
    }

});

}

代码未测试...

【讨论】:

  • 谢谢,我想我没有正确阅读文档!这就是我认为我必须在 if 中抛出一个错误。再次感谢
  • 很高兴我能帮上忙!
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2012-02-24
  • 1970-01-01
  • 2023-03-08
  • 2021-05-24
  • 2019-08-13
相关资源
最近更新 更多