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

使用DataTables加载Firebase数据时遇Invalid JSON response错误求助

问题分析与解决

你遇到的问题根源有两个:

  1. 异步逻辑处理错误:GetAllDataRealtime是async函数,调用后返回的是Promise对象而非预期的JSON字符串;且onSnapshot的回调内部return无法将值传递到外层函数,因为它是异步监听回调。
  2. DataTables配置误用:你错误使用了ajax.data字段,该字段用于给AJAX请求传递参数,而非直接传入本地数据;当已有本地数据时,应直接使用DataTables的data选项,或在数据获取后更新表格。

修正后的代码

JavaScript代码

// 引入Firebase核心模块(需确保配置正确)
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.23.0/firebase-app.js";
import { getFirestore, collection, onSnapshot } from "https://www.gstatic.com/firebasejs/9.23.0/firebase-firestore.js";

// 填入你的Firebase项目配置
const firebaseConfig = {
  apiKey: "你的API_KEY",
  authDomain: "你的AUTH_DOMAIN",
  projectId: "你的PROJECT_ID",
  storageBucket: "你的STORAGE_BUCKET",
  messagingSenderId: "你的SENDER_ID",
  appId: "你的APP_ID"
};

// 初始化Firebase
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

let table;

// 页面加载完成后初始化空表格
$(document).ready(function () {
  table = $("#test").DataTable({
    columns: [
      { data: "Number" },
      { data: "First_Name" },
      { data: "Last_Name" },
      { data: "Rings" },
      { data: "Floor" },
      { data: "Pommel" },
      { data: "H_Bar" },
      { data: "P_Bars" },
      { data: "Vault" },
    ],
  });

  // 实时监听Firebase数据变化,更新表格
  const dbRef = collection(db, "Gymnasts");
  onSnapshot(dbRef, (querySnapshot) => {
    const gymnasts = [];
    querySnapshot.forEach((doc) => {
      gymnasts.push(doc.data());
    });
    // 清空旧数据、添加新数据并重新渲染
    table.clear().rows.add(gymnasts).draw();
  });
});

HTML代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Test</title>

    <script src="https://code.jquery.com/jquery-3.7.0.js"></script>
    <link
      rel="stylesheet"
      href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.css"
    />
    <script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.js"></script>
    <!-- module脚本需在jQuery和DataTables之后加载 -->
    <script type="module" src="script.js"></script>
  </head>
  <body>
    <table id="test" class="display" style="width: 100%">
      <thead>
        <tr>
          <th>Number</th>
          <th>First_Name</th>
          <th>Last_Name</th>
          <th>Rings</th>
          <th>Floor</th>
          <th>Pommel</th>
          <th>H_Bar</th>
          <th>P_Bars</th>
          <th>Vault</th>
        </tr>
      </thead>
    </table>
  </body>
</html>

关键修正说明

  • 移除无效的async函数:onSnapshot是实时监听API,无需用async函数包裹,直接在页面初始化后设置监听即可。
  • 表格实时更新逻辑:先初始化空表格,当Firebase数据更新时,通过clear()清空旧数据、rows.add()插入新数据、draw()重新渲染,实现数据实时同步。
  • 避免Promise误用:不再试图直接获取异步函数的返回值,而是在数据回调中直接操作表格,符合异步逻辑的处理规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:12:07