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

Discord.js代码多次触发求助:树莓派3运行下无法单次执行

解决Discord.js代码被多次触发的问题

看起来你的问题出在并列的if语句结构上,以及可能对return的使用位置不对。让我一步步帮你理清:

问题根源

你的代码里三个if是完全独立的,只要对应的条件满足,每个if块都会依次执行。比如如果一条消息同时满足“在指定频道”和“是!ping命令”,那第一个打印日志的if和第二个处理ping的if都会运行,这会让你误以为代码被“多次触发”。另外,如果你的return只加在内部的嵌套if里(比如ping的权限判断分支),它只会退出那个嵌套的if,不会终止整个消息处理函数,后面的if仍然会执行。

解决方案

有两种常用的方式让代码只执行一次符合条件的逻辑:

1. 使用else if替代并列if

把多个独立的if改成if-else if链,这样程序只会执行第一个满足条件的分支,后面的分支不会再被判断:

const Discord = require('discord.js');
const { prefix, token } = require('./config.json');
const client = new Discord.Client();

client.once('ready', () => { console.log('Ready!') })
client.on('error', console.error);

client.on('message', message =>{
  // 先排除机器人自己的消息,避免自循环触发
  if (message.author.bot) return;

  if (message.channel.id == '...........') { 
    console.log(message.content);
    // 如果这里执行后不需要处理其他命令,就加return
    // return;
  } else if (message.content.startsWith(`${prefix}ping`)) {
    if (message.member.roles.some(role => role.name === '⚙️ | Manager')) {
      message.channel.send('Pong!');
    } else { 
      message.channel.send('Not enough rights! :no_entry:'); 
    }
  } else if (message.content.startsWith(`${prefix}test`)) {
    if (message.author.id == '.........') {
      const role = message.guild.roles.find('name', 'test');
      message.member.addRole(role);
      message.channel.send('test');
    }
  }
});

client.login(token);

2. 在每个分支末尾添加return

如果你想保持if的独立性(比如某些场景下需要多个分支执行,但你现在不需要),可以在每个if块的末尾添加return,这样执行完当前分支后就直接退出整个消息处理函数,不会再执行后面的逻辑:

client.on('message', message =>{
  if (message.author.bot) return;

  if (message.channel.id == '...........') { 
    console.log(message.content);
    return; // 执行后直接退出,不处理后面的命令
  }

  if (message.content.startsWith(`${prefix}ping`)) {
    if (message.member.roles.some(role => role.name === '⚙️ | Manager')) {
      message.channel.send('Pong!');
    } else { 
      message.channel.send('Not enough rights! :no_entry:'); 
    }
    return; // 处理完ping后退出
  }

  if (message.content.startsWith(`${prefix}test`)) {
    if (message.author.id == '.........') {
      const role = message.guild.roles.find('name', 'test');
      message.member.addRole(role);
      message.channel.send('test');
    }
    return; // 处理完test后退出
  }
});

额外注意点

  • 我添加了if (message.author.bot) return;,这是为了避免机器人自己发送的消息触发事件,导致不必要的循环。
  • 如果你使用的是Discord.js v12及以上版本,roles.find('name', 'test')需要改成roles.cache.find(r => r.name === 'test'),addRole也要改成roles.add(role),不过从你的代码写法看应该是v11版本,这个可以根据实际情况调整。

内容的提问来源于stack exchange,提问作者floriskn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:08:11