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

如何在JS文件中使用Firebase Authentication?解决报错与对象访问问题

问题描述

我遇到了错误:createUserWithEmailAndPassword is not defined。请问如何在auth.js文件中访问index.html里初始化的auth对象?是将其作为参数传递,还是在模块化JavaScript配置中有更好的Firebase认证管理方式?恳请指导!


相关代码

HTML代码

<form id="signup-form">
    <div class="input-field">
        <input type="email" id="signup-email" required />
        <label for="signup-email">Email address</label>
    </div>
    <div class="input-field">
        <input type="password" id="signup-password" required />
        <label for="signup-password">Password</label>
    </div>
    <button type="submit">Sign Up</button>
</form>

<script type="module">
    import { initializeApp } from "https://www.gstatic.com/firebasejs/10.14.1/firebase-app.js";
    import { getAuth } from "https://www.gstatic.com/firebasejs/10.14.1/firebase-auth.js";

    const firebaseConfig = {
        apiKey: "API_KEY",
        authDomain: "AUTH_DOMAIN",
        projectId: "PROJECT_ID",
        storageBucket: "STORAGE_BUCKET",
        messagingSenderId: "MESSAGING_SENDER_ID",
        appId: "APP_ID",
        measurementId: "MEASUREMENT_ID"
    };

    const app = initializeApp(firebaseConfig);
    const auth = getAuth(app);  // Initializes the auth service
</script>
<script src="scripts/auth.js"></script>

JS代码(scripts/auth.js)

const signupForm = document.querySelector('#signup-form');

signupForm.addEventListener('submit', (e) => {
    e.preventDefault();
    const email = signupForm['signup-email'].value;
    const password = signupForm['signup-password'].value;

    createUserWithEmailAndPassword(auth, email, password).then((cred) => {
        console.log(cred);
    }).catch((error) => {
        console.error("Error creating user:", error);
    });
});

解决方案

1. 先解决createUserWithEmailAndPassword is not defined错误

该错误是因为auth.js中未导入对应的Firebase Auth方法,需在auth.js顶部添加导入语句:

// 在auth.js开头添加
import { createUserWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/10.14.1/firebase-auth.js";

2. 共享auth对象的两种有效方式

方式一:挂载到全局对象(快速实现)

在HTML的module脚本中,将auth赋值给window全局对象,让auth.js可以直接访问:

<script type="module">
    // ... 原有初始化代码 ...
    const auth = getAuth(app);
    window.auth = auth; // 挂载到全局
</script>

方式二:模块化管理(推荐规范)

将Firebase初始化逻辑抽成独立模块,通过ES模块导出/导入共享auth对象,避免全局变量污染:

步骤1:创建scripts/firebase.js

import { initializeApp } from "https://www.gstatic.com/firebasejs/10.14.1/firebase-app.js";
import { getAuth } from "https://www.gstatic.com/firebasejs/10.14.1/firebase-auth.js";

const firebaseConfig = {
    apiKey: "API_KEY",
    authDomain: "AUTH_DOMAIN",
    projectId: "PROJECT_ID",
    storageBucket: "STORAGE_BUCKET",
    messagingSenderId: "MESSAGING_SENDER_ID",
    appId: "APP_ID",
    measurementId: "MEASUREMENT_ID"
};

const app = initializeApp(firebaseConfig);
export const auth = getAuth(app); // 导出auth对象

步骤2:修改HTML引入模块

<form id="signup-form">
    <!-- 表单内容不变 -->
</form>

<script type="module" src="scripts/firebase.js"></script>
<script type="module" src="scripts/auth.js"></script>

步骤3:修改auth.js导入auth对象

import { auth } from './firebase.js';
import { createUserWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/10.14.1/firebase-auth.js";

const signupForm = document.querySelector('#signup-form');

signupForm.addEventListener('submit', (e) => {
    e.preventDefault();
    const email = signupForm['signup-email'].value;
    const password = signupForm['signup-password'].value;

    createUserWithEmailAndPassword(auth, email, password).then((cred) => {
        console.log(cred);
    }).catch((error) => {
        console.error("Error creating user:", error);
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:33:20