Next.js13+Firebase Firestore查询文档读取量异常求助
useEffect触发逻辑与状态管理漏洞
你的useEffect依赖数组使用[status == "authenticated"],虽然当status从loading变为authenticated时会触发回调,但代码中未在getData执行后将filled设为true,导致每次useEffect触发时,filled始终为false,都会重复调用getData。每次getData执行都会发起一次getDocs查询,即使返回空结果,也会产生读取操作,直接导致读取量累加。Next.js Strict Mode的重复渲染影响
开发环境下Next.js默认开启Strict Mode,会强制组件挂载两次,useEffect也会执行两次,这会让getData被调用两次,产生额外的查询读取。NextAuth会话状态的多次变更
useSession返回的status可能多次变化:比如初始loading状态、到authenticated状态,或是会话自动刷新时的状态更新。每次status变化都会触发useEffect,进而重复调用getData,多次查询的累加导致读取量波动。Firebase控制台统计包含后台操作
你使用NextAuth的Firebase适配器,适配器会在后台读取users、sessions等集合的文档(比如验证会话有效性、获取用户信息),这些读取会被Firebase控制台计入总读取量,而不仅仅是posts集合的查询。这类后台操作的次数不稳定,会导致读取量出现无规律波动。
修正useEffect依赖与状态更新
将useEffect的依赖改为[status, filled],并在getData执行完成后设置filled为true,同时移除不必要的setTimeout:useEffect(() => { setLoader(true); if (status === "authenticated" && !filled) { getData().then(() => setFilled(true)); } }, [status, filled]);调整Strict Mode设置(开发环境可选)
若需在开发环境避免重复渲染,可以在next.config.js中关闭Strict Mode:module.exports = { reactStrictMode: false, };优化会话监听逻辑
使用useSession的required选项简化认证判断,避免不必要的状态变更触发:const { data: session } = useSession({ required: true });配置后组件会在会话未认证时自动跳转,减少无效的状态监听与查询触发。
内容的提问来源于stack exchange,提问作者SG_stack

