Rumah > Soal Jawab > teks badan
Saya sedang menulis cangkuk untuk mendapatkan userole daripada pangkalan data langsung dalam js seterusnya dan saya mendapat ralat "Tidak boleh membaca sifat yang tidak ditentukan (baca '_repo')". Beginilah rupa cangkuk saya
import { useEffect, useState } from "react"; import { useRouter } from "next/router"; import { onAuthStateChanged } from "firebase/auth"; import { auth, db } from "../firebase"; const useAuth = () => { const [currentUser, setCurrentUser] = useState(null); const [role, setRole] = useState(null); const router = useRouter(); useEffect(() => { const unsubscribe = onAuthStateChanged(auth, (user) => { if (user) { setCurrentUser(user); state let nodeRef; if (user.role === "user") { nodeRef = ref(db, `users/${user.uid}/role`); } else if (user.role === "trainer") { nodeRef = ref(db, `trainers/${user.uid}/role`); } else if (user.role === "admin") { nodeRef = ref(db, `admins/${user.uid}/role`); } else if (user.role === "nutritionist") { nodeRef = ref(db, `nutritionists/${user.uid}/role`); } onValue(nodeRef, (snapshot) => { const userRole = snapshot.val(); setRole(userRole); }); } else { setCurrentUser(null); setRole(null); // Redirect to login page if user is not logged in router.push("/login"); } }); return () => unsubscribe(); }, []); return { currentUser, role }; }; export default useAuth;
Beginilah rupa konfigurasi firebase saya
// Import the functions you need from the SDKs you need import { initializeApp } from "firebase/app"; import { getAuth } from "firebase/auth"; import { getDatabase } from "firebase/database"; import { getStorage } from "firebase/storage"; const firebaseConfig = { }; // Initialize Firebase const app = initializeApp(firebaseConfig); const auth = getAuth(app); const db = getDatabase(app); const storage = getStorage(app); export { auth, db, storage };
Ini adalah struktur pangkalan data saya
- users - <user_id> - displayName: "User's display name" - email: "User's email address" - role: "user" - ... - trainers - <trainer_id> - displayName: "Trainer's display name" - email: "Trainer's email address" - role: "trainer" - ... - admins - <admin_id> - displayName: "Admin's display name" - email: "Admin's email address" - role: "admin" - ... - nutritionists - <nutritionist_id> - displayName: "Nutritionist's display name" - email: "Nutritionist's email address" - role: "nutritionist" - ...
Saya telah mencuba ini kerana jelas saya melakukan sesuatu yang salah dengan pangkalan data, tetapi saya telah mencuba membaca dokumentasi dan masih menghadapi masalah. Saya baru dalam firebase.
P粉2079697872024-03-21 11:06:08
Disediakan kepada onAuthStateChanged()
通过 User
< 调用/a> 对象。它没有 role
hartanah.
Ini bermakna baris berikut tidak melakukan apa-apa:
let nodeRef; if (user.role === "user") { nodeRef = ref(db, `users/${user.uid}/role`); } else if (user.role === "trainer") { nodeRef = ref(db, `trainers/${user.uid}/role`); } else if (user.role === "admin") { nodeRef = ref(db, `admins/${user.uid}/role`); } else if (user.role === "nutritionist") { nodeRef = ref(db, `nutritionists/${user.uid}/role`); }
Selepas melaksanakan kod di atas, nodeRef
将变为 undefined
,然后您将其输入到 onValue
ia membuang ralat yang anda lihat. p>
Jika peranan pengguna telah ditambahkan sebagai tuntutan tersuai kepada token pengesahan pengguna, anda perlu mendapatkan token ID pengguna dan kemudian mendapatkan tuntutan yang diperlukan.
user.getIdTokenResult() .then(idToken => { const tokenRole = idToken.claims.role; // trust it? setRole(tokenRole); }) .catch(err => { // TODO: Handle token handling errors });