discord.js机器人命令无响应问题求助(附完整代码)
Discord.js机器人无法响应命令的解决方案
核心问题分析
- 事件监听错误:discord.js v14及以上版本已废弃
message事件,改用messageCreate事件,原代码无法监听到用户消息。 - 缺失消息内容权限:读取用户消息内容需要
MessageContent网关意图,且必须在Discord开发者后台手动开启该权限。 - 冗余的机器人消息判断:原代码通过用户名和 discriminator 判断机器人消息,不如直接使用
msg.author.bot可靠。
修改后的代码实现
index.js 修改版
const { Client, GatewayIntentBits } = require('discord.js'); // 补充MessageContent意图,用于读取消息内容 const robot = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ] }); const comms = require("./comms.js"); let config = require('./config.json'); let prefix = config.prefix; let token = config.token; robot.on("ready", function() { console.log(robot.user.username + " пробудився, і готовий ділитися мудрістю..."); }); // 将message事件替换为messageCreate robot.on('messageCreate', (msg) => { // 直接过滤机器人发送的消息 if (msg.author.bot) return; // 检查消息是否以设定的前缀开头 if (!msg.content.startsWith(prefix)) return; // 提取命令名和参数 const args = msg.content.slice(prefix.length).trim().split(/ +/); const commandName = args.shift().toLowerCase(); // 查找匹配的命令并执行 const targetCommand = comms.comms.find(cmd => cmd.name === commandName); if (targetCommand) { targetCommand.out(robot, msg, args); } }); robot.login(token);
comms.js 优化版(可选)
let config = require('./config.json'); let prefix = config.prefix; function test(robot, mess, args) { mess.channel.send('Test!') } function greeting(robot, mess, args) { mess.reply("Вітаю тебе! Почуй мою мудрість, і ставатимеш як я...") } // 直接定义命令数组,无需额外push操作 module.exports.comms = [ { name: "test", out: test, about: "Тестова команда" }, { name: "greeting", out: greeting, about: "Команда для вітання" } ];
必须的后台配置步骤
- 打开Discord开发者门户,找到你的机器人应用。
- 切换到「Bot」标签页。
- 在「Privileged Gateway Intents」区域,开启「Message Content Intent」权限。
- 重启机器人,测试
!greeting和!test命令是否正常响应。
内容的提问来源于stack exchange,提问作者Yurii Andriichuk
相关产品推荐
相关产品推荐

