You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:07:41