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

将Discord.js事件处理器拆分至独立文件时出现‘cannot read properties of undefined’错误

解决Discord.js事件拆分后TypeError: cannot read properties of undefined (reading 'cache')错误

问题根源

这个错误的核心原因是事件处理器的参数传递不匹配:

  • 你在messageReactionAdd.js的execute函数里期望第一个参数是client实例,但在index.js注册事件时,并没有把client传递进去,而是直接把Discord.js触发事件的原参数(reaction, user)传给了execute。
  • 这导致execute函数里的client参数实际上是reaction对象,真正的客户端实例是undefined,所以访问client.channels.cache时就会抛出错误。

修复方案

方案1:在注册事件时主动传递client实例

修改index.js中的事件注册代码,将client作为第一个参数传给execute函数:

for (const file of eventFiles) {
  const event = require(`./events/${file}`);
  if (event.once) {
    // 把client作为第一个参数传入
    client.once(event.name, (...args) => event.execute(client, ...args));
  } else {
    client.on(event.name, (...args) => event.execute(client, ...args));
  }
}

这样你的messageReactionAdd.js原代码就可以正常运行,因为client参数会被正确传入。

方案2:通过事件对象自带的client属性获取(更推荐)

Discord.js的Reaction对象本身就包含了client实例的引用,你可以直接用reaction.client来替代代码中的client,无需修改index.js:

module.exports = {
  name: 'messageReactionAdd',
  execute(reaction, user) {
    // 直接从reaction中获取client实例
    const channel = reaction.client.channels.cache.find(channel => channel.name === "test");
    const targetMessageId = 874736592542105640;
    const emotes = ["kannathinking", "🍎"];
    const roleID = reaction.emoji.name === emotes[0] 
      ? "874730080486686730" 
      : "874729987310235738";

    if (reaction.message.id === targetMessageId && emotes.includes(reaction.emoji.name)) {
      channel.send(`${user} was given the <@&${roleID}> role`);
    }
  }
}

这个方案更简洁,因为Discord.js的绝大多数核心对象(如Message、Guild、User等)都自带client属性,不需要手动传递。

额外提醒

你的messageReactionRemove.js事件文件也存在完全相同的问题,请用上述任意一种方案同步修复。

内容的提问来源于stack exchange,提问作者Max von der Mühle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:32:42