【问题标题】:projectFirestore not giving back document collection in an async function in Vue?projectFirestore 没有在 Vue 的异步函数中返回文档集合?
【发布时间】:2021-11-17 19:24:29
【问题描述】:

我正在尝试从 Firebase/Firestore 返回用户集合,但是当我在控制台中检查它时,我拥有的代码没有返回任何内容。你能帮我吗,我是Vue的新手?我正在尝试查找与当前登录的用户具有相同显示名称但我被卡住的用户。

<template>
  <p>Process Payroll</p>
  <h1>{{ user.displayName }} </h1>
  <h1>{{ docs }} </h1>
</template>

<script>
import  getUser  from '@/composables/getUser'
import { ref } from 'vue'
import { projectFirestore } from '../firebase/config'

export default {
    setup(){
        const { user } = getUser()
        const lastName = ref('')
        const firstName = ref('')
        const docs = ref('')
        
        const returnUser = async () => {
                const res = await projectFirestore.collection('users').get()
                if (!error.value) {
                    console.log(res.docs)
                    const doc = res.docs.filter((user1) =>{
                        if (user1.displayName == user.displayName){
                            return user.lastName
                        }
                    })
                    docs.value = doc
            }
        }

        return {user, docs, returnUser }
    }
}
</script>

<style>

</style>

【问题讨论】:

  • 你能分享一下getUser()的样子吗?
  • 首先,这个条件需要改变。 if (user.displayName == user.displayName){ return user.lastName }。这对于阵列中的所有用户都是正确的。或许,您可以将传递给过滤函数的变量重命名为userObj。其次,您为什么不只是需要的特定用户,而不是获取整个集合然后在客户端将其过滤掉?

标签: javascript firebase vue.js google-cloud-firestore


【解决方案1】:

首先,您在filter 函数上应用的条件需要更改,以免变量混淆。目前,您正在将元素的 displayName 与其自身进行比较,这始终是正确的。

其次,您可以通过简单的查询从集合中查询所需的文档。更多信息可以在here找到。

另外,在跳到下一个结论之前,请检查从firestore 返回的响应。来自firestoreget() 方法返回一个querySnapshot,因此无需调用res.docs。您将直接在res 中获取您的文档,这将是一个数组。只需对其进行迭代以获取单个文档,然后可以使用 .data() 方法轻松访问其属性

解决方案
<template>
  <p>Process Payroll</p>
  <h1>{{ user.displayName }} </h1>
  <h1>{{ docs }} </h1>
</template>

import getUser from "@/composables/getUser";
import { ref } from "vue";
import { projectFirestore } from "../firebase/config";

export default {
  setup() {
    const { user } = getUser();
    const lastName = ref("");
    const firstName = ref("");
    const docs = ref([]);

    const returnUser = async () => {
      const res = await projectFirestore
        .collection("users")
        .where("displayName", "==", user.displayName)
        .get();
      if (!error.value) {
        // check your response here.
        console.log(res);
        const doc = res.filter((userObj) => {
          if (user.displayName === userObj.data().displayName) {
            return user.lastName;
          }
        });
        docs.value = doc;
      }
    };

     onMounted(returnUser)

    return { user, docs, returnUser };
  },
};

【讨论】:

  • 它仍然没有触发 projectFirestore 方法并且在 console.log(res) 中没有显示任何内容。感谢您的帮助!
  • 您能否检查您的浏览器console 是否有错误?一定有一些初始化错误什么的。
  • 查看此线程以了解如何实例化 firestore SDK。 firebase.google.com/docs/firestore/quickstart#web-version-8_2
  • 我已经正确设置了firestore,并且控制台中没有错误。当我删除异步功能时,我可以使用以下命令在控制台中记录文档: const res = projectFirestore.collection('users')
  • 明白了。我刚刚意识到我们定义了函数,但并没有真正调用它。我们需要在onMounted 挂钩中调用returnUser 函数。现在应该可以正常工作了。我已经更新了我的答案。请检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2021-02-23
  • 2023-04-04
  • 2023-03-24
相关资源
最近更新 更多