Firebase在线状态构建报错:userStatusFirestoreRef.set不是函数
解决Firebase实时数据库引用调用
.set()时报错set is not a function 错误的核心原因是混淆了Firebase实时数据库(Realtime Database)和Firestore的API使用方式,并且在模块化API中,实时数据库的写入操作不是通过引用对象的.set()方法调用,而是需要使用独立的set函数。
具体修复步骤:
在
firebase.ts中导入并导出实时数据库的set函数
从firebase/database中导入set,并添加到导出列表里:// 在firebase.ts的import部分添加 import { onDisconnect, ref as dbRef, getDatabase, onValue, set // 新增导入set函数 } from "firebase/database"; // 在export部分添加set export { // ... 其他导出内容 onDisconnect, dbRef, firebaseDb, onValue, set // 新增导出 };修改业务逻辑代码,使用
set函数替代引用的.set()方法
同时建议修改变量名(避免和Firestore混淆),把userStatusFirestoreRef改成userStatusRTDBRef(RTDB代表Realtime Database),然后用set函数执行写入:import { auth, serverTimestamp, onDisconnect, dbRef, firebaseDb, onValue, set // 导入新增的set函数 } from "../firebase"; if (uid) { // 修改变量名,明确是实时数据库的引用 const userStatusRTDBRef = dbRef(firebaseDb, `status/${uid}`); const isOfflineForDatabase = { state: "offline", last_changed: serverTimestamp(), }; const isOnlineForDatabase = { state: "online", last_changed: serverTimestamp(), }; const connectedRef = dbRef(firebaseDb, ".info/connected"); onValue(connectedRef, (snapshot) => { if (snapshot.val() == false) { // 用set函数替代引用的.set()方法 set(userStatusRTDBRef, isOfflineForDatabase); return; } onDisconnect(userStatusRTDBRef) .set(isOfflineForDatabase) .then(() => { // 同样用set函数 set(userStatusRTDBRef, isOnlineForDatabase); }); }); }
额外说明:
官方的在线状态方案是同时使用实时数据库和Firestore:实时数据库用来监听连接状态和处理离线触发(因为它支持onDisconnect),最终需要把状态同步到Firestore中供业务查询。如果你还需要同步到Firestore,需要在写入实时数据库的同时,调用Firestore的setDoc函数写入对应的文档。
内容的提问来源于stack exchange,提问作者Pusoy
相关产品推荐
相关产品推荐

