开发者问题收集

ReactJS/Firebase:TypeError:无法读取未定义的属性(读取“indexOf”)

2022-05-25
1837

我收到此错误:未捕获 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);
};
3个回答

您的代码中没有使用 indexOf

可能有两个原因:

  1. 您在 代码 中使用了 indexOf,但它不在这里(在您发送的屏幕截图中),可能在另一个文件中! 因此您可以使用“?字符”来解决这个问题。例如:item?.availablity?.indexOf("Jhones"); 您可以使用 IDE 进行深度搜索,在所有代码中查找 indexOf

  2. 模块在 moduleCodes 中使用 indexOf 例如,您正在将数据传递给 Firebase,并且 firebase 想要在此数据中找到 indexOf 内容,但 fireBase 没有找到。

  • 您可以向 firebase 存储库创建一个问题并请求解决此问题
  • 您可以克隆此存储库,修复此问题并在本地 npm 上使用部署,并将其与修复后的代码一起使用
  • 您可以在代码库中声明该函数
mahdi pakravan
2022-05-25

您应该使用“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 });
Bob the Builder
2023-06-30

不知道这是否有帮助,但当我的文档引用出现问题时(因为文档 ID 未定义),我遇到了同样不明确的错误。因此,如果其他人遇到此问题,请首先检查文档 ID 和引用是否有效。

Chen Peleg
2024-01-28