Firebase实时数据库数据自动删除问题排查求助
Firebase实时数据库聊天数据自动删除问题
我使用Firebase实时数据库存储聊天数据,但数据会在一段时间后自动消失。已尝试修改数据库规则、创建新Firebase项目等操作,问题仍存在,且无其他人员可访问该数据库。
当前数据库规则
{ "rules": { ".read": false, ".write": false } }
发送消息代码
const postMessage = async (receiverUserId, message, user) => { const { senderUserId, senderType, receiverType,receiverDetails,senderDetails } = await getSenderReceiverDetails(user, receiverUserId); const senderMessage = firebase .database() .ref( "chatRoom/messages/" + senderType + "_" + senderUserId + "/" + receiverType + "_" + receiverUserId ); const receiverMessage = firebase .database() .ref( "chatRoom/messages/" + receiverType + "_" + receiverUserId + "/" + senderType + "_" + senderUserId ); senderMessage.push({ message: message, timestamp: firebase.database.ServerValue.TIMESTAMP, source: "SENDER", }); receiverMessage.push({ message: message, timestamp: firebase.database.ServerValue.TIMESTAMP, source: "RECEIVER", }); const tokenDoc = await UserToken.findOne({ where: { user_id: receiverUserId, status: "active", user_type: receiverType, }, }); if (tokenDoc) { const fcmToken = tokenDoc.dataValues.fcm_token; if (fcmToken && fcmToken != "") { notificationService.sendNotification("New message",senderDetails.name + ": " + message, fcmToken); } } };
获取消息代码
const getMessages = async (user, receiverUserId) => { const { senderUserId, senderType, receiverType, senderDetails, receiverDetails, } = await getSenderReceiverDetails(user, receiverUserId); // console.log("senderUserId: ", senderUserId, " senderType ====> ", senderType, receiverType); const chatRoomRef = firebase .database() .ref( "chatRoom/messages/" + senderType + "_" + senderUserId + "/" + receiverType + "_" + receiverUserId ); const bookingRef = firebase .database() .ref( "chatRoom/booking/" + senderType + "_" + senderUserId + "/" + receiverType + "_" + receiverUserId ); // Use Promise.all to wait for both data requests to complete const [chatRoomSnapshot, bookingSnapshot] = await Promise.all([ chatRoomRef.once("value"), bookingRef.once("value"), ]); let messageObj = []; const chatRoomData = chatRoomSnapshot.val(); if (chatRoomData !== null) { messageObj = Object.values(chatRoomData); } let bookingObj = null; const bookingData = bookingSnapshot.val(); console.log("booinggggggg====>",bookingData); if (bookingData !== null) { const bookingValues = Object.values(bookingData); console.log("hiiiiiiiii===>",bookingValues); if (bookingValues.length > 0) { bookingObj = bookingValues[bookingValues.length - 1]; } } // get the sender's name and profile URL from the `user` object const senderName = senderDetails.name; const senderProfileUrl = senderDetails.profile_pic; const receiverName = receiverDetails.name; const receiverProfileUrl = receiverDetails.profile_pic; const profileDetails = { senderName, senderProfileUrl, receiverName, receiverProfileUrl, }; // console.log("messageObj =========> ", messageObj); console.log("bookingObj ========> ", bookingObj); return { messageObj, bookingObj, profileDetails }; };
排查方向与解决方案
检查自动清理机制
Firebase实时数据库无默认自动删除逻辑,需排查是否配置了Cloud Functions定时触发器或第三方工具的数据过期策略,可前往Firebase控制台「Cloud Functions」页面查看是否存在定时删除数据的函数。验证规则生效状态
当前规则.write: false会拒绝所有写入,但你的代码能成功发送消息,说明实际生效的规则可能不一致。前往「Realtime Database」→「规则」页面确认当前发布的规则是否与提供的一致,排查是否存在规则配置未发布的情况。排查代码中的删除逻辑
检查项目内所有操作数据库的代码,确认是否存在清理旧消息的逻辑(如按timestamp删除过期数据),或在业务流程中调用了remove()、set(null)等删除方法。确认存储配额与计费状态
前往Firebase控制台「计费」页面查看是否存在欠费、超出免费配额等异常状态,虽然配额超限不会自动删除数据,但可能导致服务异常。测试手动数据持久化
在Firebase控制台数据库手动添加一条测试数据,观察一段时间后是否自动删除。若手动数据也消失,问题出在项目配置或外部机制;若手动数据保留,则问题源于代码写入逻辑或关联业务流程。
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

