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
相关产品推荐
相关产品推荐

