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
相关产品推荐
相关产品推荐

