javascript - 为什么这个元素没有从 Firestore 中获取?
问题描述
代码:(我 99% 确定问题出在挂载方法中)
<div class="taskManager">
<FilterNav @filterChange="current = $event"
:current="current"/>
<div class="tasks">
<div v-if="tasks.length">
<div v-for="task in filterTasks" :key="task.id">
<SingleTask :task="task" @delete="handleDelete"
@complete="handleComplete"/>
</div>
</div>
</div>
</div>
<TasksNavbar/>
<router-view/>
</template>
<script>
import TasksNavbar from '../components/TasksNavbar.vue'
import SingleTask from '../components/SingleTask.vue'
import FilterNav from '../components/TaskFilterNav.vue'
import Navbar from '../components/Navbar.vue'
import { computed } from 'vue'
import firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/firestore'
export default {
name: 'Home',
components: { SingleTask, TasksNavbar, FilterNav, Navbar},
data() {
return {
tasks: [],
current: 'all'
};
},
mounted() {
var docRef = firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid)
docRef.get("tasks").then(function(task){
if(task.exists){
this.tasks.push(task.data())
}
}).catch(function(err){
console.log(err.message)
})
},
文件结构:集合:用户 -> 用户文档,文档名称为用户 ID -> 任务数组作为字段,其中包含任务
任务已正确保存到 Firestore,但未正确获取它们。
解决方案
当我写答案时,您编辑了您的问题
docRef.get("tasks").forEach(...)
至
docRef.get("tasks").then(...)
但它不会改变答案的内容。
docRef
是 a DocumentReference
,它的get()
方法是异步的并返回 a DocumentSnapshot
。您正在将此方法与(顺便说一句不是异步的)的get()
方法混为一谈。DocumentSnapshot
您需要执行以下操作:
var docRef = firebase.firestore().collection('users').doc(firebase.auth().currentUser.uid)
docRef.get().then(doc => {
if (doc.exists) {
const tasksArray = doc.get("tasks");
tasksArray.forEach(...);
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
另外,在这里解释,你应该注意firebase.auth().currentUser.uid
可能会返回null
,因为返回的对象 firebase.auth()
可能处于中间状态,例如初始化。
您需要确保它firebase.auth().currentUser
不为空。
根据您的具体登录流程,您可能需要将代码放在 Vue.jsmounted
挂钩中的onAuthStateChanged
观察者中:
mounted() {
firebase.auth().onAuthStateChanged(user => {
if (user) {
// Put your code here => user is not null
var docRef = firebase.firestore().collection('users').doc(user.uid)
docRef.get().then(doc => {...});
// ....
}
});
}
推荐阅读
- azure-databricks - Azure Databricks 上是否默认启用 Databricks 操作安全包?
- amazon-web-services - 使用 AWS CLI 启动服务脚本?
- android - 为键盘应用添加候选视图
- node.js - 如何使用 Sinon 存根 Mongoose 方法来测试 DAO?
- groovy - Micronauts AWS API Gateway Authorizer JSON 输出问题
- ios - 从 ViewControllerA 更新 ViewControllerB 中的标签(ViewController 都在同一视图中的容器中)
- csv - 在 neo4j 中创建一对多关系
- excel - Excel 中的高级筛选
- python - 来自 boto3 定价客户端的区域名称和位置之间的映射
- css - 使用 Angular 材质覆盖 scss 变量