代码之家  ›  专栏  ›  技术社区  ›  Grenish Rai

Firestore错误“用户文档不存在”

  •  0
  • Grenish Rai  · 技术社区  · 1 年前

    我正在进行一个类似于Linktree的项目,并实现了用于身份验证的Firebase和用于数据库的Firestore。身份验证系统运行正常,用户数据保存在名为的集合中 users 。但是,当我重定向到用户的仪表板时,我看到 undefined 在应该显示数据的区域。

    在用户的仪表板代码上,我导入了数据库获取所需的所有内容。

    import { db, auth } from "@/lib/firebaseConfig";
    import { getDoc, doc } from "firebase/firestore";
    import { signOut, onAuthStateChanged } from "firebase/auth";
    
    
    
     useEffect(() => {
        const unsubscribe = onAuthStateChanged(auth, async (user) => {
          if (user) {
            console.log("User authenticated:", user.uid); // Add a log to check user UID
            try {
              const userDocRef = doc(db, "users", user.uid);
              const userDoc = await getDoc(userDocRef);
    
              if (userDoc.exists()) {
                console.log("User document found:", userDoc.data()); // Log the data
                setUserData(userDoc.data());
              } else {
                console.log("User document does not exist."); // Log for debugging
                alert("User document does not exist.");
              }
            } catch (error) {
              console.error("Error fetching user data:", error);
              alert(
                `Error fetching user data: ${
                  error instanceof Error ? error.message : String(error)
                }`
              );
            }
          } else {
            console.log("No user is authenticated. Redirecting to login.");
            router.push("/"); // Redirect to home or login if no user is signed in
          }
        });
    
        return () => unsubscribe();
      }, [router]);
    

    这是我的 firebaseConfig.ts 文件

    import { initializeApp } from "firebase/app";
    import { getAuth } from "firebase/auth";
    import { getFirestore } from "firebase/firestore";
    
    const firebaseConfig = {
        apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
        authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
        projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
        storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
        messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
        appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
        measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
    };
    
    const app = initializeApp(firebaseConfig);
    const db = getFirestore(app);
    const auth = getAuth(app);
    
    export { db, auth };
    

    这是我最新的消防规则

    rules_version = '2';
    
    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{userId} {
          allow read, write: if true;
        }
      }
    }
    

    在那之前

    rules_version = '2';
    
    service cloud.firestore {
      match /databases/{database}/documents {
        // Allow read and write access to authenticated users on their own documents in the "users" collection
        match /users/{userId} {
          allow read, write: if request.auth != null && request.auth.uid == userId;
        }
      }
    }
    

    firestore users collection image

    user's dashboard image

    我多次尝试更改规则,包括使用实际用户的 uid 代码,但什么都没用。我还咨询了各种人工智能工具,但在这种情况下都没有奏效。

    1 回复  |  直到 1 年前
        1
  •  0
  •   Frank van Puffelen    1 年前

    这个 grenishrai 第一个屏幕截图中的文档ID看起来不像UID,因此它与您的代码在这里的功能不匹配:

    const userDocRef = doc(db, "users", user.uid);
    

    为了使您的代码正常工作,请确保您编写的文档引用以完全相同的方式构造。

    推荐文章