Discord.js v14按钮点击后无法向指定频道发消息求助
解决Discord.js按钮交互中
client.channels未定义的报错 你遇到的TypeError: Cannot read properties of undefined (reading 'channels'),核心原因是当前代码作用域里找不到client变量,导致无法访问它的channels属性。下面给你两种直接可行的解决方法:
方法一:从交互对象中直接获取client
按钮交互的回调参数i(即交互实例)本身就包含client属性,直接用i.client替换你代码里的client即可:
const filter = i => i.customId === 'accept' && i.member.roles.cache.has('1111582370265563200'); const collector = interaction.channel.createMessageComponentCollector({ filter }); collector.on('collect', async i => { if (i.customId === 'accept'){ accept.setDisabled(true) // 用i.client替代原有的client const channel = i.client.channels.cache.get('1111616693358301237'); // 先判断频道是否存在,避免后续报错 if (channel) { channel.send({embeds: [embedAccept]}); } else { console.log('目标频道不存在或未被缓存'); } i.update({embeds: [yesembed]}); } });
方法二:确保client变量在当前作用域可访问
如果你的代码是在单独的命令文件中,需要保证client实例被正确传入当前作用域。比如通过命令处理函数的参数传递:
module.exports = { name: '你的命令名称', // 在execute函数中接收client参数 async execute(interaction, client) { const filter = i => i.customId === 'accept' && i.member.roles.cache.has('1111582370265563200'); const collector = interaction.channel.createMessageComponentCollector({ filter }); collector.on('collect', async i => { if (i.customId === 'accept'){ accept.setDisabled(true) const channel = client.channels.cache.get('1111616693358301237'); if (channel) channel.send({embeds: [embedAccept]}); i.update({embeds: [yesembed]}); } }); } };
额外提示:处理频道未缓存的情况
如果目标频道不在客户端缓存中,cache.get()会返回undefined,可以改用fetch方法强制获取频道:
const channel = await i.client.channels.fetch('1111616693358301237').catch(err => console.log(err)); if (channel) { channel.send({embeds: [embedAccept]}); }
内容的提问来源于stack exchange,提问作者Sreyas Menon
相关产品推荐
相关产品推荐

