reactjs 是什么原因导致getDocs()无法根据Firestore中的特定字段检索任何数据?

ss2ws0br  于 2023-05-28  发布在  React
关注(0)|答案(1)|浏览(138)
const getUserData = async () => {
    await getDocs(collection(db, 'accounts'))
        .then((response) => {
            setUserData(response.docs.map((data) => {
            if (Number(data.data().code) === Number(token)) {
                return { ...data.data(), id: data.id };
            } else {
                return {};
            }
            }));
        });
};

下面是一个数据库参考截图:
我希望如果令牌/代码彼此匹配,用户的数据会被获取,但实际上它根本没有获取任何东西。

UseEffect(() => {
    getData()
    setToken(localStorage.getItem('token'))
    getUserData()
}, [])
wmtdaxz3

wmtdaxz31#

回复

您的getDocs()函数没有根据Firestore中的特定字段检索任何数据,可能有几个原因。

原因一:您没有使用查询

getDocs()函数本身将返回集合中的所有文档,而不考虑它们的字段。如果要根据特定字段筛选文档,则需要使用查询。例如,如果你只想获取code字段与token变量匹配的文档,你可以使用如下方法:

const getUserData = async () => {
  const q = query(collection(db, 'accounts'), where('code', '==', token));
  const querySnapshot = await getDocs(q);
  setUserData(querySnapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
};

这样,您就不需要在map函数中手动检查code字段。

原因二:您对字段使用了不正确的数据类型

Firestore支持不同的字段数据类型,如字符串,数字,布尔值,数组等如果对字段使用的数据类型与Firestore中存储的数据类型不同,则可能不会得到任何结果。例如,如果code字段在Firestore中存储为字符串,但您将其与代码中的数字进行比较,则不会获得任何匹配项。要解决这个问题,您需要确保数据类型是一致的。例如,您可以在查询中使用token变量之前将其转换为字符串:

const getUserData = async () => {
  const q = query(collection(db, 'accounts'), where('code', '==', String(token)));
  const querySnapshot = await getDocs(q);
  setUserData(querySnapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
};

原因三:您使用的字段名或路径不正确

Firestore允许您使用点表示法来访问文档中的嵌套字段。例如,如果您有一个名为user的字段的文档,其中包含一个名为name的字段的对象,则可以使用user.name访问该字段。但是,如果使用了不正确的字段名或路径,则将得不到任何结果。例如,如果使用user.name.first而不是user.name,则不会获得任何匹配项。要解决此问题,您需要确保字段名称或路径正确,并与Firestore中存储的内容匹配。例如:

const getUserData = async () => {
  const q = query(collection(db, 'accounts'), where('user.name', '==', 'Alice'));
  const querySnapshot = await getDocs(q);
  setUserData(querySnapshot.docs.map((doc) => ({ ...doc.data(), id: doc.id })));
};

我希望这能帮助你解决你的问题。

相关问题