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

Uncaught ReferenceError: firebase未定义 - 表单连Firebase数据库报错求助

问题:Firebase 9.x调用Firestore时出现"firebase is not defined"错误

我正在制作一个简单的读书论坛页面作为期末学校项目,仅使用HTML、JavaScript和CSS。刚接触后端,刚在Google Firebase中设置了云数据库。跟着教程尝试将输入表单连接到数据库,但教程使用的是Firebase 8.2.1版本,而我使用的是9.14.0版本。已按Firebase设置步骤在HTML中初始化了Firebase,但调用firebase.firestore()时,Edge调试器中出现错误:Uncaught ReferenceError: firebase is not defined。

原HTML代码

<div class="form_card">
    <form id="submit_form">
        <div class="inputBox">
            <input type="text" id="title" required="required" autocomplete="off">
            <span>Title</span>
        </div>

        <div class="inputBox">
            <input type="text" id="review" required="required" autocomplete="off">
            <span>Review</span>

            <button type="submit" id="post_btn"><p>POST</p></button>
        </div>
    </form>
</div>

<script src="form.js" type="module"></script>

<script type="module">
    // Import the functions you need from the SDKs you need
    import { initializeApp } from "https://www.gstatic.com/firebasejs/9.14.0/firebase-app.js";
    // TODO: Add SDKs for Firebase products that you want to use
    // https://firebase.google.com/docs/web/setup#available-libraries
    // Your web app's Firebase configuration
    const firebaseConfig = {
        apiKey: "AIzaSyB7ZiJKzHTsgJ3sv8QsOHPLnWCqqnGSSJ0",
        authDomain: "litary-project.firebaseapp.com",
        projectId: "litary-project",
        storageBucket: "litary-project.appspot.com",
        messagingSenderId: "147018135042",
        appId: "1:147018135042:web:eb4d3d5e9dcb79d89bd91b"
    };

    // Initialize Firebase
    const app = initializeApp(firebaseConfig);
    const db = firebase.firestore();    // 报错位置
</script>

原JavaScript代码(form.js)

var titleVal = document.getElementById('title');
var reviewVal = document.getElementById('review');

const btn = document.getElementById('post_btn');

btn.addEventListener('click', function handleClick(e) { //Listen to click
  
    e.preventDefault();

    const inputs = document.querySelectorAll('#title, #review');
    
      console.log(titleVal.value);
      console.log(reviewVal.value);

    inputs.forEach(input =>{
      input.value = '';
    });
});

解决方案

Firebase 9.x采用模块化导入的设计,不再依赖全局的firebase对象,所有功能都需要单独导入对应的函数。

1. 修改Firebase初始化代码

需要导入getFirestore函数,并用它来初始化数据库实例:

<script type="module">
    import { initializeApp } from "https://www.gstatic.com/firebasejs/9.14.0/firebase-app.js";
    // 新增导入getFirestore函数
    import { getFirestore } from "https://www.gstatic.com/firebasejs/9.14.0/firebase-firestore.js";

    const firebaseConfig = {
        apiKey: "AIzaSyB7ZiJKzHTsgJ3sv8QsOHPLnWCqqnGSSJ0",
        authDomain: "litary-project.firebaseapp.com",
        projectId: "litary-project",
        storageBucket: "litary-project.appspot.com",
        messagingSenderId: "147018135042",
        appId: "1:147018135042:web:eb4d3d5e9dcb79d89bd91b"
    };

    const app = initializeApp(firebaseConfig);
    // 使用getFirestore初始化数据库,替代原有的firebase.firestore()
    const db = getFirestore(app);

    // 如果需要在form.js中使用db,可以挂载到window对象(适合小型项目)
    window.db = db;
</script>

2. 修改form.js,添加数据写入逻辑

如果要把表单数据写入Firestore,需要导入addDoc和collection函数,并使用全局挂载的db:

import { addDoc, collection } from "https://www.gstatic.com/firebasejs/9.14.0/firebase-firestore.js";

var titleVal = document.getElementById('title');
var reviewVal = document.getElementById('review');

const btn = document.getElementById('post_btn');

btn.addEventListener('click', async function handleClick(e) {
    e.preventDefault();

    const title = titleVal.value.trim();
    const review = reviewVal.value.trim();

    if (title && review) {
        try {
            // 写入数据到"book_reviews"集合
            await addDoc(collection(window.db, "book_reviews"), {
                title: title,
                review: review,
                createdAt: new Date()
            });
            console.log("数据提交成功!");
            
            // 清空输入框
            const inputs = document.querySelectorAll('#title, #review');
            inputs.forEach(input => {
                input.value = '';
            });
        } catch (error) {
            console.error("提交失败:", error);
        }
    } else {
        console.log("标题和评论不能为空");
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:05:21