Hel*_*rld 1 firebase reactjs google-cloud-firestore
我有一个Orders.jsx文件 -
import "./Orders.css";\n\nimport React, { useCallback, useEffect, useState } from "react";\nimport { collection, doc, getDocs, orderBy, query } from "@firebase/firestore";\n\nimport { db } from "./firebase";\nimport { useStateValue } from "./StateProvider";\n\nfunction Orders() {\n const [{ user }] = useStateValue();\n const [orders, setOrders] = useState([]);\n\n const fetchData = useCallback(async () => {\n console.log("User in orders: ", user);\n const myQuery = query(\n collection(db, "users", user?.uid, "orders"),\n orderBy("created", "desc")\n );\n\n const ordersSnapshot = await getDocs(myQuery);\n ordersSnapshot.forEach((doc) => {\n console.log(doc.id, "=>", doc.data());\n });\n }, [user]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n return (\n <div className="orders">\n <h1>Your Orders</h1>\n </div>\n );\n}\n\nexport default Orders;\nRun Code Online (Sandbox Code Playgroud)\n这是我在控制台中收到的错误,网站因此而中断 -
\nUncaught (in promise) TypeError: n is undefined\n fromString index.esm2017.js:1028\n bc index.esm2017.js:14931\n fetchData Orders.jsx:15\n Orders Orders.jsx:27\n React 5\n unstable_runWithPriority scheduler.development.js:468\n React 3\n workLoop scheduler.development.js:417\n flushWork scheduler.development.js:390\n performWorkUntilDeadline scheduler.development.js:157\n js scheduler.development.js:180\n js scheduler.development.js:645\n Webpack 58\nindex.esm2017.js:1028\nRun Code Online (Sandbox Code Playgroud)\n我阅读了多个文档 Query firestore的文档和querymethod
几秒钟后控制台也会显示所需的项目
\nUncaught (in promise) TypeError: n is undefined\n fromString index.esm2017.js:1028\n bc index.esm2017.js:14931\n fetchData Orders.jsx:15\n Orders Orders.jsx:27\n React 5\n unstable_runWithPriority scheduler.development.js:468\n React 3\n workLoop scheduler.development.js:417\n flushWork scheduler.development.js:390\n performWorkUntilDeadline scheduler.development.js:157\n js scheduler.development.js:180\n js scheduler.development.js:645\n Webpack 58\nindex.esm2017.js:1028\nRun Code Online (Sandbox Code Playgroud)\n如何解决这个问题?
\n编辑:我现在的工作解决方案-
\npi_3JmvgVSDCQEtZc6S0Prn6ji3 => Object { created: 1634801251, basket: (1) [\xe2\x80\xa6], amount: 179900 } Orders.jsx:22\npi_3Jmvf7SDCQEtZc6S1r5tIVse => Object { amount: 329800, created: 1634801165, basket: (2) [\xe2\x80\xa6] } Orders.jsx:22\npi_3JmvdxSDCQEtZc6S1WLNIeec => Object { amount: 458900, created: 1634801093, basket: (2) [\xe2\x80\xa6] } Orders.jsx:22\npi_3JmvJ1SDCQEtZc6S0rBxmNsN => Object { amount: 6228300, basket: (5) [\xe2\x80\xa6], created: 1634799795 } Orders.jsx:22\nRun Code Online (Sandbox Code Playgroud)\n但是我仍然收到错误,但我只是将其记录到控制台
\n小智 5
所以,首先我遇到了同样的错误,实际上我面临着同样的情况。
原因 :
因此,在这种情况下发生的情况是,当您从 firebase 发出 fetch 请求时,您的user.uid未定义,这就是您收到错误“TypeError: n is undefined”的原因。
因此,我在您的案例中观察到,您必须将当前用户存储在 StateProvider 中,以便整个应用程序可以访问它,然后您从 Orders.jsx 文件中的 StatProvider 导入您的用户以发出获取请求。
但实际发生的情况是,当您从 StateProvider 导入用户时,user.uid实际上需要时间来呈现该值,因此几秒钟内它会将user.uid的值呈现为未定义,然后几秒钟后它就会呈现正确的值直到它呈现该值时,您已经使用未定义的 uid 从 firebase 发出了获取请求,这导致了 error 。
为了解决这个问题,
在 StateProvider 中存储当前用户时,只需将 user.uid 存储在 localStorage 中。
localStorage.setItem("uid",currentuser.uid);
Run Code Online (Sandbox Code Playgroud)
在发出 fetch 请求而不是使用 user.uid 时,您可以从 localStorage 获取 uid 的值,这将解决错误。
try {
if (user) {
const myQuery = query(
collection(db, "users", localStorage.getItem("uid"), "orders"),
orderBy("created", "desc")
);
// Get the snapshot which is real-time values and will update when there is a change in the DB
const ordersSnapshot = await getDocs(myQuery);
setOrders(
ordersSnapshot.docs.map((doc) => ({
id: doc.id,
data: doc.data(),
}))
);
} else {
setOrders([]);
}
// ordersSnapshot.forEach((doc) => {
// console.log(doc.id, "=>", doc.data());
// });
} catch (error) {
console.error(error);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1398 次 |
| 最近记录: |