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

Discord.js对接Firestore时调用.where()提示不是函数问题排查

问题根因

.where()是Firestore集合引用(CollectionReference)专属的查询方法,你在调用.where()前最后调用了.doc(itemName),得到的是单个文档的引用(DocumentReference),该类型对象本身就没有where方法,因此直接抛出不是函数的类型错误。

优化修复方案

你已经提前通过const doc = await itemToDelete.get()拿到了目标文档的快照,完全不需要再发起二次查询,直接从已拿到的文档数据中读取ownerId字段做权限判断即可,既减少多余的数据库请求,也能直接解决报错问题。

另外你原代码还有三处可优化的细节:

  • Remove.js顶部引入的require('@firebase/firestore')是客户端Firestore SDK的依赖,你使用的是Firebase Admin SDK初始化的数据库实例,该引入完全多余,可以直接删除
  • interaction.options.getString是同步方法,不需要加await
  • 文档删除操作最好加await,避免删除逻辑还没执行完就先给用户返回响应
修正后的execute方法代码
async execute(interaction, db) {
    const itemName = interaction.options.getString('item')
    const itemToDelete = db.collection('items').doc(interaction.guildId).collection('items').doc(itemName);
    const doc = await itemToDelete.get();
    if(!doc.exists) {
        return interaction.reply({
            content: `${itemName} 不存在于藏品中,你可以使用 /list 命令确认正确名称`,
            ephemeral: true
        })
    }
    
    const ownerId = interaction.user.id
    // 直接从已查询到的文档数据中取出ownerId判断
    if(doc.data().ownerId !== ownerId) {
        return interaction.reply({
            content: `你不是 ${itemName} 的所有者,请联系所有者删除该藏品`,
            ephemeral: true
        })
    }
    await itemToDelete.delete();
    return await interaction.reply(`${itemName} 已从藏品中移除!`)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:30:00