Discord Bot开发inviteCreate事件无message参数获取modlog通道问题求助
问题解决方案
你遇到的报错本质是两个问题:
inviteCreate事件回调只有invite入参,不存在message对象,你错误调用了message.guild.id- 读取modlog通道的逻辑错误,你直接将数据库key传入了
client.channels.cache.get(),没有先从数据库读取你存储的通道配置
具体修复步骤
- 第一步:从
invite对象直接取所属服务器ID:Discord.js的Invite实例自带guild属性,指向邀请所属的服务器对象,直接调用invite.guild.id即可拿到服务器ID,不需要依赖message对象。 - 第二步:修正数据库读取逻辑:先通过
db.get()取出你之前存储的modlog通道配置,再从通道缓存中匹配对应的通道实例。 - 第三步:增加容错判断:避免服务器未设置modlog通道、通道被删除等场景下的报错。
修正后的inviteCreate事件代码
// 注意先引入quick.db和Discord,和你其他文件的引入逻辑保持一致 client.on("inviteCreate", async invite => { // 从invite取服务器ID,读取数据库配置 const modlogChannel = await db.get(`modlog_${invite.guild.id}`) // 容错:未设置modlog就直接返回 if (!modlogChannel) return // 从缓存取真实通道实例,判断通道是否存在 const log = client.channels.cache.get(modlogChannel.id) if (!log) return // 你的Embed逻辑可以在这里补全 const inviteCreated = new Discord.MessageEmbed() .setTitle('新邀请创建') .setDescription(`服务器内创建了新的邀请链接:${invite.url}`) .setTimestamp() log.send({embeds: [inviteCreated]}) })
可选优化:修改modlog命令的存储逻辑
你当前是直接存储整个channel对象到quick.db,更稳妥的做法是只存储通道ID,减少存储体积和后续缓存匹配出错的概率:
// 原modlog命令的存储行修改为 await db.set(`modlog_${message.guild.id}`, channel.id) // 对应的事件里读取后就不需要再取.id了,直接get即可 const log = client.channels.cache.get(await db.get(`modlog_${invite.guild.id}`))
内容的提问来源于stack exchange,提问作者Refluent
相关产品推荐
相关产品推荐

