ReactJS/Firebase:TypeError:无法读取未定义的属性(读取“indexOf”)
我收到此错误:未捕获 TypeError:无法读取未定义的属性(读取“indexOf”)
仅当我重新加载页面时才会发生这种情况。第一次加载时没问题,但当我重新加载时就会发生这种情况。
我尝试执行类似以下操作:favoritesItems?.map((favorite) => .... 但没有帮助,所以我认为可能是身份验证中的问题?
编辑:如果我删除 const { user } = UserAuth() 并硬编码 UserID,即使重新加载后一切正常
Favorites.js
function Favorites() {
const [favoritesItems, setFavoritesItems] = React.useState([])
const { user } = UserAuth();
const UserID = user.uid
const favoritesRef = doc(db, "favorites", UserID)
const unsub = onSnapshot(doc(db, "favorites", UserID), (doc) => {
setFavoritesItems(doc.data().favs);
});
const removeFav = async (name) => {
await updateDoc(favoritesRef, {
favs: arrayRemove({"name": name.name, "ytb": name.ytb, "url": name.url})
});
}
return (
<div className="container mx-auto px-5 py-10">
<h2 className="text-xl lg:text-3xl uppercase tracking-wider">My favorites collection</h2>
<div className="flex flex-col items-center sm:items-start gap-10 mt-5 sm:grid grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5">
{favoritesItems?.map((favorite) => (
<div key={favorite.name} className="flex flex-col gap-2 w-64 md:w-72 ">
<iframe src={favorite.url} title={favorite.name} allowFullScreen className="w-full" />
<h1 className="font-light">{favorite.name}</h1>
<div className="flex justify-between gap-3">
<a href={favorite.ytb} target="_blank"><ExternalLinkIcon className="w-5 cursor-pointer" /></a>
<TrashIcon onClick={() => removeFav(favorite)} className="w-5 cursor-pointer" />
</div>
</div>
)) }
</div>
</div>
)
}
export default Favorites
AuthContext.js
const UserContext = createContext();
export const AuthContextProvider = ({ children }) => {
const [user, setUser] = useState({});
const signIn = (email, password) => {
return signInWithEmailAndPassword(auth, email, password)
}
const createUser = (email, password) => {
return createUserWithEmailAndPassword(auth, email, password);
};
const logout = () => {
return signOut(auth)
}
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
setUser(currentUser);
});
return () => {
unsubscribe();
};
}, []);
return (
<UserContext.Provider value={{ createUser, signIn, user, logout }}>
{children}
</UserContext.Provider>
);
};
export const UserAuth = () => {
return useContext(UserContext);
};
您的代码中没有使用 indexOf
可能有两个原因:
-
您在 代码 中使用了 indexOf,但它不在这里(在您发送的屏幕截图中),可能在另一个文件中! 因此您可以使用“?字符”来解决这个问题。例如:item?.availablity?.indexOf("Jhones"); 您可以使用 IDE 进行深度搜索,在所有代码中查找 indexOf
-
模块在 moduleCodes 中使用 indexOf 例如,您正在将数据传递给 Firebase,并且 firebase 想要在此数据中找到 indexOf 内容,但 fireBase 没有找到。
- 您可以向 firebase 存储库创建一个问题并请求解决此问题
- 您可以克隆此存储库,修复此问题并在本地 npm 上使用部署,并将其与修复后的代码一起使用
- 您可以在代码库中声明该函数
您应该使用“react-firebase-hooks/auth”。它使在您的应用程序中保存当前登录用户的身份验证变得更加容易。像这样从中导入:
import { useAuthState } from "react-firebase-hooks/auth";
从
import { auth, db } from "../../config/firebase";
获取 auth 变量,您可以像这样将其传递到 useAuthState 钩子中
const [user] = useAuthState(auth);
。
我可能迟到了,但我遇到了与 indexOf 相同的错误消息。我的问题不同。
我做错的是,我期望字段在文档中。但问题是在将该文档添加到集合时,我忘记传入一个字段。
我想要传入的字段是文档创建后的文档 ID,所以我在创建文档时实际上没有这个字段,但创建文档后才有。创建文档后,您必须获取从 addDoc() 返回的快照,从中获取 id 属性,然后使用 updateDoc() 将 documentID 添加到您刚刚创建的文档中。示例代码:
const commentSnapshot = await addDoc(commentsRef, {
postId: postId,
comment: comment,
name: name,
userId: user?.uid
});
const commentId = commentSnapshot.id;
const commentDocRef = doc(commentsRef, commentId);
await updateDoc(commentDocRef, { commendId: commentId });
不知道这是否有帮助,但当我的文档引用出现问题时(因为文档 ID 未定义),我遇到了同样不明确的错误。因此,如果其他人遇到此问题,请首先检查文档 ID 和引用是否有效。