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

Firebase初始化逻辑拆分后实时数据库监听器报Unknown node type错误

Firebase实时数据库监听器触发"Unknown node type"内部错误

问题概述

将Firebase初始化逻辑拆分至独立包并构建后,在Next.js应用中导入使用时,实时数据库的onChildAdded、onValue等监听器方法会触发内部断言错误。该问题仅在特定条件下出现,直接在应用内定义初始化逻辑或导入未构建的源码包时可正常工作。

复现条件

  • Firebase初始化逻辑被拆分到独立包,经构建后导入使用
  • 实时数据库查询同时包含两个约束条件(例如limitToFirst(5)和orderByChild("updatedAt"))
  • 使用onChildAdded、onValue等实时数据监听器方法

初始化逻辑代码(独立包中)

declare global {
  var EMULATORS_STARTED: boolean;
}
const EMULATORS_STARTED = "EMULATORS_STARTED";
let app: FirebaseApp, rtdb: Database;

const connectEmulator = () => {
  if (!global[EMULATORS_STARTED]) {
    global[EMULATORS_STARTED] = true;

    connectDatabaseEmulator(rtdb, "127.0.0.1", 9000);
  }
};

export const initializeFirebase = () => {
  const firebaseConfig = {
    projectId: "demo-project-id",
    databaseURL: "http://127.0.0.1:9000/?ns=demo-project-id-default-rtdb",
  };

  app = initializeApp(firebaseConfig);
  rtdb = getDatabase(app);

  connectEmulator();

  return { app, rtdb };
};

应用中导入并设置监听器的代码

import { initializeFirebase } from "../../deps/build/firebase";

const { rtdb } = initializeFirebase();

const conversationsQuery = query(
  ref(rtdb, "data"),
  limitToFirst(5),
  orderByChild("updatedAt")
);

useEffect(() => {
  const onChildAddedUnsubscribe = onChildAdded(conversationsQuery, (data) => {
    console.log("added");
  });

  return () => {
    onChildAddedUnsubscribe();
  };

}, [])

触发的错误信息

Error: Firebase Database (${JSCORE_VERSION}) INTERNAL ASSERT FAILED: Unknown node type

关键观察

  • 直接导入独立包的未构建源码(而非构建后的产物)时,所有功能完全正常
  • 仅实时数据库的监听器方法受影响,get方法或Firestore等其他Firebase服务无此问题
  • 仅当查询同时使用两个约束条件时触发错误,单个约束条件的查询不会出现该问题(仅使用limitToFirst时存在onChildRemoved异常触发的次要问题)
  • 拆分初始化逻辑到独立包的方案已长期稳定使用,仅在添加带有双约束的实时监听器后出现此问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:22:37