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
相关产品推荐
相关产品推荐

