You need to enable JavaScript to run this app. Discord Bot开发inviteCreate事件无message参数获取modlog通道问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Discord Bot开发inviteCreate事件无message参数获取modlog通道问题求助

问题解决方案

你遇到的报错本质是两个问题:

  1. inviteCreate 事件回调只有invite入参,不存在message对象,你错误调用了message.guild.id
  2. 读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:30:01