Firebase 在第一次后拒绝许可然后在第二次工作

Firebase denies permission after first time then works on second time

Firebase 在第一次将数据推送到实时数据库后拒绝权限...但是当我第二次推送数据时又可以工作...

export const writeClass = async (
  courseId,
  topicName,
  classIntro,
  youtubeLinkId,
  classNoteLink
) => {

  const dbRef = ref(getDatabase());
  try {
    const totalClasses = await get(
      child(dbRef, `Courses/${courseId}/totalClasses`)
    );
    var totalClassesNum = parseInt(totalClasses.val()) + 1;
    console.log(totalClasses.val());

    const msg = await update(
      ref(db, `Courses/${courseId}/classes/${totalClassesNum}`),
      {
        classIntro: classIntro,
        topicName: topicName,
        youtubeLinkId: youtubeLinkId,
        classNoteLink: classNoteLink,
      }
    )
      .then(() => {
        update(ref(db, `Courses/${courseId}`), {
          totalClasses: totalClassesNum,
        });
        console.log("Section added");
        return true;
      })
      .catch((error) => {
        console.log(error.message);
        // alert(error.message)
        return error.message;
      });
  return msg;

  } catch (error) {
    // alert(error.message)

    console.log(error);
  }
};

Firebase 规则:

".write" :
"root.child('specialUsers').child(auth.uid).child('is_admin').val()
=== true

当页面 reloads/app 重新启动时,Firebase 会自动恢复登录用户,但这需要它调用服务器(检查 a.o。帐户是否被禁用)并且可能需要一些时间。

这意味着您的代码首次运行时,用户可能尚未登录,您需要在代码中进行检查。问题发生在您的代码中的确切位置有点不清楚,但您需要将其包装在:

if (firebase.auth().currentUser !== null) {
  ...
}

更好的方法是在用户登录或注销时做出反应,您可以按照 getting the currently signed in user:

文档中的第一个片段所示进行操作
import { getAuth, onAuthStateChanged } from "firebase/auth";

const auth = getAuth();
onAuthStateChanged(auth, (user) => {
  if (user) {
    // User is signed in, see docs for a list of available properties
    // https://firebase.google.com/docs/reference/js/firebase.User
    const uid = user.uid;
    // ...
  } else {
    // User is signed out
    // ...
  }
});