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

Discord.js机器人messageCreate事件触发无限刷屏问题求助

故障描述

开发Discord机器人时出现消息刷屏问题:预期实现逻辑为机器人发送一条消息,等待5秒后自动删除该消息,之后重复执行流程;实际测试时机器人在目标频道持续刷屏发送内容为test的消息。

根因分析
  1. messageCreate事件会监听对应频道内的所有新消息,包括机器人自身发送的消息。现有逻辑没有过滤机器人自己发出的消息,导致机器人发完test后,这条新消息会再次触发消息创建回调,再次发送test,形成无限自触发循环,最终造成刷屏。
  2. 现有逻辑绑定在消息创建事件上,只要频道内有任何用户发消息都会触发发送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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:36:26