如何在Google Firestore中通过当前登录用户获取指定文档
解决Firebase获取用户UID对应文档失败的问题
我来帮你排查这个问题,核心问题主要出在用户身份验证的时机、Firestore API调用错误和Vue实例属性的访问方式上,咱们一步步来修复:
1. 先修正Firestore的API调用错误
你代码里用了.document(userId),但Firestore的正确方法是.doc(),这个拼写错误会导致查询根本无法执行,这是第一个要改的点。
2. 处理Auth状态的异步问题
Firebase的currentUser是异步初始化的,组件created钩子执行时,用户可能还没完成登录验证,这时候currentUser会是null,自然拿不到uid。正确的做法是监听Auth状态变化,等用户身份确认后再去查询Firestore。
3. 正确访问Vue的计算属性
在组件的created钩子中,要通过this.userId来访问计算属性,直接写userId会被当成全局变量,导致"未定义"的错误。
4. 单个文档查询不需要forEach
你是查询单个指定UID的文档,get()返回的是DocumentSnapshot,不是批量的QuerySnapshot,所以不需要用forEach,直接读取doc.data()即可。
修正后的完整代码
<script> // eslint-disable-next-line import firebase from "firebase"; // eslint-disable-next-line import firestore from "firestore"; import db from "@/components/fbInit"; export default { components: {}, data() { return { user: null // 单个用户数据,不需要数组,因为是查单个文档 }; }, computed: { userId() { return firebase.auth().currentUser?.uid; // 可选链避免null报错 } }, created() { // 监听Auth状态变化,确保用户已登录 firebase.auth().onAuthStateChanged(user => { if (user) { // 用户已登录,获取UID并查询文档 db.collection("userProfiles") .doc(this.userId) .get() .then(doc => { if (doc.exists) { // 文档存在,赋值数据 this.user = { id: doc.id, name: doc.data().name, company: doc.data().company, state: doc.data().state }; } else { console.log("找不到对应用户的文档!"); } }) .catch(error => { console.error("获取文档出错:", error); }); } else { console.log("用户未登录!"); } }); } }; </script>
额外检查项
- 确认
userProfiles集合中确实存在以当前用户UID命名的文档,可以去Firebase控制台查看 - 检查Firestore的安全规则,确保允许登录用户读取自己的文档,比如:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /userProfiles/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
内容的提问来源于stack exchange,提问作者Yewla
相关产品推荐
相关产品推荐

