Discord.js机器人messageCreate事件触发无限刷屏问题求助
故障描述
开发Discord机器人时出现消息刷屏问题:预期实现逻辑为机器人发送一条消息,等待5秒后自动删除该消息,之后重复执行流程;实际测试时机器人在目标频道持续刷屏发送内容为test的消息。
根因分析
messageCreate事件会监听对应频道内的所有新消息,包括机器人自身发送的消息。现有逻辑没有过滤机器人自己发出的消息,导致机器人发完test后,这条新消息会再次触发消息创建回调,再次发送test,形成无限自触发循环,最终造成刷屏。- 现有逻辑绑定在消息创建事件上,只要频道内有任何用户发消息都会触发发送
test的逻辑,本身也不符合“自动定时循环发消息”的预期需求。
原始问题代码
client.on('messageCreate', (message) => { let chan = client.channels.cache.get('988807641792905248') if (message.channel.id === "988807641792905248" ) return chan.send(`test`).then(mess => { setTimeout(() => { mess.delete() }, 5000) }) })
修复方案
根据实际需求二选一调整即可:
- 场景1:需要在目标频道收到普通用户发的消息时,才触发机器人发
test并5秒自删
只需在事件回调最开头增加机器人消息过滤逻辑,阻断自触发循环即可,修复后代码:client.on('messageCreate', (message) => { // 过滤所有机器人发送的消息,避免自触发循环 if (message.author.bot) return; let chan = client.channels.cache.get('988807641792905248') if (message.channel.id === "988807641792905248" ) { chan.send(`test`).then(mess => { setTimeout(() => { mess.delete() }, 5000) }) } }) - 场景2:需要机器人自动按固定周期循环发
test并5秒自删,不需要依赖用户发消息触发
把发送逻辑从messageCreate事件中移出,在机器人就绪事件里写定时循环逻辑即可,参考代码:client.on('ready', () => { const chan = client.channels.cache.get('988807641792905248') // 循环间隔可按需调整,示例设置为5秒发送1次,发送后5秒自动删除 setInterval(() => { chan.send(`test`).then(mess => { setTimeout(() => { mess.delete() }, 5000) }) }, 5000) })
注意:使用第二种定时循环方案时,不要把这段逻辑写在会被多次触发的回调中,否则会生成多个重复定时任务导致多倍刷屏。
内容的提问来源于stack exchange,提问作者italuan
相关产品推荐
相关产品推荐

