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

Firebase删除数据报doc is not a function错误怎么解决

报错原因排查与解决方法

核心报错根源:变量名冲突

你定义的renderList函数形参命名为doc,和Firebase模块化SDK导出的doc构造函数重名了。点击事件回调执行时,作用域优先读取当前函数的形参doc(该参数是Firestore返回的文档快照对象,不是函数),因此调用doc(firestore, "admin", id)时抛出类型错误。

其他关联问题

  • ID重复问题:你给所有删除按钮设置了相同的id="DelModBtn",HTML中ID全局唯一,document.querySelector('#DelModBtn')只会匹配页面第一个删除按钮,后续行的删除事件绑定会失效。
  • ID获取逻辑错误:删除按钮的直接父元素是你创建的ControlDiv,你把data-id属性挂载在tr节点上,直接调用e.target.parentElement.getAttribute('data-id')只能读取到ControlDiv的属性,无法拿到正确的文档ID。

修复后的代码示例

// 首先确认你头部已经正确导入相关方法,v9+模块化语法如下
// import { doc, deleteDoc } from "firebase/firestore";

// 1. 把形参名改成不会和SDK方法冲突的名字,比如docSnapshot
function renderList(docSnapshot){        
    let trow = document.createElement('tr');
    let td1 = document.createElement('td');
    let td2 = document.createElement('td');
    let ControlDiv = document.createElement("div");
    const date = docSnapshot.data().created.toDate().toDateString();
    trow.setAttribute('data-id', docSnapshot.id);
    td1.textContent = docSnapshot.data().email;
    td2.textContent = date;
    // 2. 移除重复的id属性
    ControlDiv.innerHTML = '<button type="button" class="btn btn-danger btn-primary my-2 ml-2">Delete</button>'
    trow.appendChild(td1);
    trow.appendChild(td2);
    trow.appendChild(ControlDiv);
    adminList.appendChild(trow);
    // 3. 直接从当前ControlDiv下找按钮,不用全局querySelector
    const deleteBtn = ControlDiv.querySelector('button');
    deleteBtn.addEventListener('click', async (e) => {
        e.stopPropagation();
        // 4. 正确获取tr上的data-id,用closest方法更稳妥,避免层级修改后失效
        let id = e.target.closest('tr').getAttribute('data-id');
        // 现在这里的doc就是你导入的SDK方法,不会冲突
        await deleteDoc(doc(firestore, "admin", id));
    })    
}

内容的提问来源于stack exchange,提问作者programming newbee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:24:02