使用Firebase实时数据库set函数时出现db._checkNotDeleted错误
解决@firebase/database调用set时的TypeError错误
错误信息
Reference_impl.ts:482 Uncaught (in promise) TypeError: db._checkNotDeleted is not a function at ref (Reference_impl.ts:482:6) at HTMLInputElement.keypress_handler (__layout.svelte:85:25) ref @ Reference_impl.ts:482 keypress_handler @ __layout.svelte:85
问题代码
import { get, ref, set } from '@firebase/database'; // ... let updates = {}; let chatID = [fb.auth.currentUser.uid, userID].sort().join('-'); let users = {}; users[fb.auth.currentUser.uid] = true; users[userID] = true; let chat = { type: 'direct', users: users, id: chatID, timestamp: Date.now() }; updates['/chats/' + chatID] = chat; updates['/users/' + fb.auth.currentUser.uid + '/chats/' + chatID] = true; updates['/users/' + userID + '/chats/' + chatID] = true; return await set(ref(fb.db), updates);
原因分析
这个错误的核心是传入ref()的fb.db不是有效的Firebase Realtime Database实例,大概率是初始化脚本里的问题:
- 误用了Firestore的初始化方法(比如
getFirestore())而非Realtime Database的getDatabase() - 初始化脚本未正确导出数据库实例
解决方案
1. 修正Firebase初始化脚本
确保你的fb脚本正确初始化并导出Realtime Database实例:
// fb.js 示例代码 import { initializeApp } from 'firebase/app'; import { getDatabase } from 'firebase/database'; import { getAuth } from 'firebase/auth'; // 你的Firebase配置 const firebaseConfig = { apiKey: "YOUR_API_KEY", authDomain: "YOUR_AUTH_DOMAIN", databaseURL: "YOUR_DATABASE_URL", // Realtime Database的URL必须配置 projectId: "YOUR_PROJECT_ID", storageBucket: "YOUR_STORAGE_BUCKET", messagingSenderId: "YOUR_SENDER_ID", appId: "YOUR_APP_ID" }; const app = initializeApp(firebaseConfig); // 正确获取Realtime Database实例 export const db = getDatabase(app); export const auth = getAuth(app);
2. 替换set为update(逻辑优化)
你的代码是批量更新多个路径,用update()才是正确的API(set()会覆盖整个根节点,导致数据丢失):
// 先导入update import { get, ref, update } from '@firebase/database'; // ... // 最后一行替换为 return await update(ref(fb.db), updates);
3. 增加用户登录状态校验
避免currentUser为null时出错:
const currentUser = fb.auth.currentUser; if (!currentUser) { throw new Error('用户未登录,无法创建聊天'); } let chatID = [currentUser.uid, userID].sort().join('-'); users[currentUser.uid] = true; updates['/users/' + currentUser.uid + '/chats/' + chatID] = true;
内容的提问来源于stack exchange,提问作者Penguin Master
相关产品推荐
相关产品推荐

