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

使用Firebase 9 Firestore自定义ID添加用户时遇TypeError: doc is not a function

Firestore使用自定义ID添加用户时出现TypeError: doc is not a function错误

问题描述

我尝试在Firestore中使用自定义ID添加用户,相关代码如下:

import { db } from "../firebase/config";
import {collection, addDoc, deleteDoc, updateDoc, doc, setDoc} from 'firebase/firestore'
 
export const useFirestore = (collections) => {

    const addDocumentUser = async (doc, id) => {
        try{
            const addedDocument = await setDoc(doc(db, collections, id), {...doc});
            return addedDocument.id
            
        }
        catch(err){
            console.log(err)
            dispatch({type: 'ERROR', payload: err})
        }
    }
    

    return {addDocumentUser}
}

运行后控制台出现如下错误:

TypeError: doc is not a function
    at addDocumentUser (useFirestore.js:62:1)
    at useSignup.js:29:1
    at async signup (useSignup.js:23:1)
    at async handleSubmit (Signup.js:23:1)

我已导入所有所需内容,且使用不带自定义ID的addDoc函数时数据库访问正常,请问我哪里操作出错了?

解决方案

问题出在命名冲突上:你导入的Firestore的doc函数,和addDocumentUser函数的第一个参数doc重名了。在函数内部调用doc(db, collections, id)时,实际引用的是传入的参数doc(它是一个对象,不是函数),所以才会抛出“doc is not a function”的错误。

只需要修改参数名称,避免和导入的Firestore函数重名即可,比如把参数doc改成userDoc:

import { db } from "../firebase/config";
import {collection, addDoc, deleteDoc, updateDoc, doc, setDoc} from 'firebase/firestore'
 
export const useFirestore = (collections) => {

    const addDocumentUser = async (userDoc, id) => {
        try{
            await setDoc(doc(db, collections, id), {...userDoc});
            return id // 直接返回自定义ID即可,setDoc不返回带id的对象
            
        }
        catch(err){
            console.log(err)
            dispatch({type: 'ERROR', payload: err})
        }
    }
    

    return {addDocumentUser}
}

另外补充:setDoc方法返回的是Promise<void>,不会携带文档ID,所以你可以直接返回传入的自定义id,无需尝试从addedDocument中获取。

内容的提问来源于stack exchange,提问作者Pascal Meger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:05:33