You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase 9.19.1登录页开发:点击Register按钮提示register未定义

解决Firebase 9.x中"register is not defined"错误及相关问题

错误原因分析

  • ES模块作用域限制:package.json中"type": "module"的配置,让index.js作为ES模块运行,内部定义的register、login函数默认是模块私有,不会挂载到全局window对象,导致HTML中的onclick无法访问。
  • Firebase v9 API误用:代码采用了Firebase v8的全局firebase对象语法(如firebase.auth()),但v9采用模块化导入机制,必须明确导入对应功能模块。
  • 变量声明不规范:函数内直接使用email、password等变量,未用let/const声明,存在隐式全局变量风险。
  • package.json格式错误:"type": "module"被放在dependencies对象内,属于配置位置错误。

分步解决方案

1. 修正Firebase模块导入与初始化

替换原有初始化代码,使用v9模块化API:

import { initializeApp } from "firebase/app";
import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "firebase/auth";
import { getDatabase, ref, set, update } from "firebase/database";

const firebaseConfig = {
  apiKey: "AIzaSyAOHZgsV3Fk3fpw161NLp_NoqLeUPeCrGM",
  authDomain: "daring-fin-310722.firebaseapp.com",
  projectId: "daring-fin-310722",
  storageBucket: "daring-fin-310722.appspot.com",
  messagingSenderId: "766339557711",
  appId: "1:766339557711:web:f34a0c4c3f37ee4532bd3a"
};

const app = initializeApp(firebaseConfig);
const auth = getAuth(app); // 替代v8的firebase.auth()
const database = getDatabase(app); // 替代v8的firebase.database()

2. 修复函数全局访问问题(二选一)

方案A:将函数挂载到全局window对象

在register和login函数定义后添加:

window.register = register;
window.login = login;

方案B:移除HTML onclick属性,改用事件监听(推荐)

修改HTML按钮部分:

<div id="button_container">
  <button id="loginBtn">Login</button>
  <button id="registerBtn">Register</button>
</div>

在index.js末尾添加事件监听:

document.addEventListener('DOMContentLoaded', () => {
  document.getElementById('loginBtn').addEventListener('click', login);
  document.getElementById('registerBtn').addEventListener('click', register);
});

3. 规范变量声明与修复逻辑错误

  • 给函数内变量添加let/const声明:
function register () {
  const email = document.getElementById('email').value;
  const password = document.getElementById('password').value;
  const full_name = document.getElementById('full_name').value;
  const favourite_song = document.getElementById('favourite_song').value;
  const milk_before_cereal = document.getElementById('milk_before_cereal').value;
  // 后续逻辑不变
}
  • 修正validate_password函数的长度判断错误:
function validate_password(password) {
  return password.length >= 6; // 原代码错误比较字符串与数字,改为判断长度
}

4. 修正package.json格式

将"type": "module"移到顶层:

{
  "type": "module",
  "dependencies": {
    "firebase": "^9.19.1"
  }
}

完整修改后的index.js代码

import { initializeApp } from "firebase/app";
import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "firebase/auth";
import { getDatabase, ref, set, update } from "firebase/database";

const firebaseConfig = {
  apiKey: "AIzaSyAOHZgsV3Fk3fpw161NLp_NoqLeUPeCrGM",
  authDomain: "daring-fin-310722.firebaseapp.com",
  projectId: "daring-fin-310722",
  storageBucket: "daring-fin-310722.appspot.com",
  messagingSenderId: "766339557711",
  appId: "1:766339557711:web:f34a0c4c3f37ee4532bd3a"
};

const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
const database = getDatabase(app);

function register () {
  const email = document.getElementById('email').value;
  const password = document.getElementById('password').value;
  const full_name = document.getElementById('full_name').value;
  const favourite_song = document.getElementById('favourite_song').value;
  const milk_before_cereal = document.getElementById('milk_before_cereal').value;

  if (!validate_email(email) || !validate_password(password)) {
    alert('Email or Password is Outta Line!!');
    return;
  }
  if (!validate_field(full_name) || !validate_field(favourite_song) || !validate_field(milk_before_cereal)) {
    alert('One or More Extra Fields is Outta Line!!');
    return;
  }
 
  createUserWithEmailAndPassword(auth, email, password)
  .then((userCredential) => {
    const user = userCredential.user;
    const database_ref = ref(database, 'users/' + user.uid);
    const user_data = {
      email,
      full_name,
      favourite_song,
      milk_before_cereal,
      last_login: Date.now()
    };
    set(database_ref, user_data);
    alert('User Created!!');
  })
  .catch((error) => {
    alert(error.message);
  });
}

function login () {
  const email = document.getElementById('email').value;
  const password = document.getElementById('password').value;

  if (!validate_email(email) || !validate_password(password)) {
    alert('Email or Password is Outta Line!!');
    return;
  }

  signInWithEmailAndPassword(auth, email, password)
  .then((userCredential) => {
    const user = userCredential.user;
    const database_ref = ref(database, 'users/' + user.uid);
    const user_data = {
      last_login: Date.now()
    };
    update(database_ref, user_data);
    alert('User Logged In!!');
  })
  .catch((error) => {
    alert(error.message);
  });
}

function validate_email(email) {
  const expression = /^[^@]+@\w+(\.\w+)+\w$/;
  return expression.test(email);
}

function validate_password(password) {
  return password.length >= 6;
}

function validate_field(field) {
  return field !== null && field.length > 0;
}

document.addEventListener('DOMContentLoaded', () => {
  document.getElementById('loginBtn').addEventListener('click', login);
  document.getElementById('registerBtn').addEventListener('click', register);
});

验证步骤

  1. 保存所有修改后的文件
  2. 执行npm install确保依赖安装完成
  3. 用本地服务器(如npx serve)启动项目,避免file://协议的跨域问题

内容的提问来源于stack exchange,提问作者wzack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:47:02