我正在用GatsbyJS和Firebase制作一个小型博客。我的博客是静态的,就像通常的盖茨比博客一样,但是我正在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面板创建了该文档一样,此代码可以正常工作,没有任何问题。因此,我想输入catch语句,如果该postID的文档不存在,则可以创建它,或者至少创建setState来显示该postID没有评论
谢谢
答案 0 :(得分: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引用的位置上没有文档,则生成的文档将为空,并且对其进行调用将返回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);
}
});
}
代码未经测试...