Firebase数组删除选中元素报错:No document to update
问题分析与解决方法
你遇到的FirebaseError: No document to update错误,核心原因是执行updateDoc时,detalhesProjetoKey对应的项目文档不存在,或者这个变量本身的值已经失效(比如变成空、undefined或错误的ID)。以下是针对性的排查和解决步骤:
1. 先确认核心变量的有效性
在删除函数里添加日志,打印detalhesProjetoKey的值,确认点击第二个员工时这个项目ID是否正确:
const deleteFuncionarioFromProject = async (funcionarioKey) => { console.log('待删除员工ID:', funcionarioKey); console.log('当前项目ID:', detalhesProjetoKey); // 重点看这个值是否正确 const docRef = doc(db, "projetos", detalhesProjetoKey); await updateDoc(docRef, { funcionarios: arrayRemove(funcionarioKey) }); }
如果detalhesProjetoKey在点击第二个员工时为空/错误,说明这个变量的状态管理出了问题(比如组件重渲染后状态丢失、循环渲染时闭包捕获旧值)。
2. 解决状态/闭包导致的变量失效问题
如果是循环渲染员工按钮,很可能出现闭包捕获旧detalhesProjetoKey的情况,或者变量未同步更新。可以用两种方式修复:
方案A:将项目ID作为参数传入删除函数
修改按钮的点击事件,直接把当前项目ID传进去:
<button type="button" className='button button-delete' onClick={() => deleteFuncionarioFromProject(funcionarioDetails.uid, detalhesProjetoKey)} > <i className="pi pi-trash"></i> </button>
然后更新删除函数:
const deleteFuncionarioFromProject = async (funcionarioKey, projectKey) => { const docRef = doc(db, "projetos", projectKey); await updateDoc(docRef, { funcionarios: arrayRemove(funcionarioKey) }); }
方案B:用useCallback包裹删除函数
通过React的useCallback确保函数始终捕获最新的detalhesProjetoKey:
import { useCallback } from 'react'; // ... const deleteFuncionarioFromProject = useCallback(async (funcionarioKey) => { const docRef = doc(db, "projetos", detalhesProjetoKey); await updateDoc(docRef, { funcionarios: arrayRemove(funcionarioKey) }); }, [detalhesProjetoKey]); // 依赖项里加入detalhesProjetoKey
3. 添加文档存在性检查(可选但推荐)
为了避免因文档不存在导致的报错,可以在更新前先检查文档是否存在:
const deleteFuncionarioFromProject = async (funcionarioKey, projectKey) => { const docRef = doc(db, "projetos", projectKey); const docSnap = await getDoc(docRef); if (!docSnap.exists()) { console.error('项目文档不存在,无法删除员工:', projectKey); return; } await updateDoc(docRef, { funcionarios: arrayRemove(funcionarioKey) }); }
内容的提问来源于stack exchange,提问作者João Silva
相关产品推荐
相关产品推荐

