Discord.js 为何在ready事件中使用awaitMessages失效且触发频道消息报错?
常见报错核心原因&修正方案
- 方法调用对象错误
代码中在get_channel.send()的返回值上链式调用awaitMessages,但channel.send()执行后返回的是Bot刚发出的单条消息实例,awaitMessages()是频道实例(TextChannel)的原生方法,不属于单条消息对象,直接链式调用会抛出TypeError: channel.send(...).awaitMessages is not a function,是最直接的运行报错来源。 - 变量拼写/作用域错误
消息校验规则里的captha存在拼写偏差,若对应的验证码变量名实际为captcha,会因作用域内找不到匹配变量直接抛出ReferenceError,导致流程中断。 - 缓存未加载完成触发空对象调用
ready事件的触发节点早于bot全量同步服务器、频道缓存的时间点,此时立刻绑定每20秒执行一次的定时任务,很容易出现guilds.cache.get(x.id)取值为空的情况,后续调用.channels.cache.get()时会抛出Cannot read properties of undefined类报错。 - 高版本参数格式不兼容
discord.js v14及以上版本要求嵌入消息必须通过embeds数组格式传入,代码中旧写法{ embed }不符合参数规范,会直接触发格式校验报错。 - 缺少必要intent导致功能失效
新版discord.js需要手动开启对应权限意图:未开启GuildMessages时bot无法接收频道内的新消息事件;未开启MessageContent时bot无法读取普通用户发送的消息文本,会导致awaitMessages的校验规则永远无法命中,哪怕流程不报错也会一直等到超时。
修正后可运行的代码示例
// 客户端初始化阶段必须声明所需intent(v13+版本强制要求) const client = new Client({ intents: [ 'Guilds', 'GuildMessages', 'MessageContent' ] }) client.on('ready', () => { // 延迟5秒启动定时任务,等缓存完全加载后再执行业务逻辑 setTimeout(() => { setInterval(gift_start, 20000) }, 5000) async function gift_start() { // 逐层判断缓存取值是否存在,避免空对象调用 const targetGuild = client.guilds.cache.get(x.id) if (!targetGuild) return const get_channel = targetGuild.channels.cache.get(x.channel) if (!get_channel) return // 按v14规范传入嵌入消息参数 await get_channel.send({ embeds: [embed] }) // 在频道实例上调用awaitMessages,传入符合规范的参数 try { await get_channel.awaitMessages({ filter: (message) => !message.bot && captcha === message.content.toLowerCase(), max: 1, time: 10 * 1000, errors: ['time'] }) await get_channel.send('Good!') } catch (err) { await get_channel.send('No answer!') } } })
内容的提问来源于stack exchange,提问作者DmitrySenpai
相关产品推荐
相关产品推荐

