discord.js v13前缀命令处理程序开发:机器人无响应无报错如何解决
问题修复方案
1. 优先级最高的逻辑错误(messageCreate.js)
你当前的messageCreate事件执行顺序完全错误,且API调用、逻辑判断都有问题:
- 你在还没判断消息是否带前缀、是否是机器人发送的情况下,就先切割了消息内容取命令,会导致非命令消息也被切割报错
- 你把用户ID判断放在了所有过滤逻辑的最前面,且判断逻辑写法错误,同时错把
message.author写成了message.user(message.user是交互事件的属性,消息事件中发信人属性是message.author) - 逻辑运算符优先级错误:
!message.author.id === "xxx"等价于(!message.author.id) === "xxx",结果永远为假,直接触发return,所有逻辑都不会执行 message.channel不能直接转字符串,要取message.channel.name才是频道名
修正后的messageCreate.js代码:
const prefix = "."; module.exports = { name: "messageCreate", async execute(message, client) { // 先做过滤判断,不符合的直接return,避免无意义运算 if ( !message.content.startsWith(prefix) || message.author.bot || message.channel.type === "DM" ) return; // 过滤完再处理命令参数 const args = message.content.slice(prefix.length).trim().split(/ +/); const command = args.shift().toLowerCase(); // 正确的用户ID判断写法,调整判断顺序 if (message.author.id !== "798928603201929306") return; console.log( `${message.author.tag} used ${command} in #${message.channel.name} triggered an command.` ); if (!client.commands.has(command)) return; try { await client.commands.get(command).execute(message, args, client); } catch (error) { console.error(error); message.reply("there was an error trying to execute that command!"); } }, };
2. 检查client初始化的意图配置(discord.js v13强制要求)
v13版本必须显式声明需要的网关意图,你需要在创建Client实例的时候加上对应意图,否则收不到messageCreate事件:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, // 必须开启,否则收不到服务器消息 Intents.FLAGS.GUILD_MEMBERS // 可选,需要用到成员信息的时候加 ] });
同时要去Discord开发者后台的Bot设置页,打开Message Content Intent权限,否则v13版本无法读取消息内容。
3. 其他可选优化点
- 你所有的handler加载都是异步方法,调用的时候最好加上await避免加载时序问题:
(async () => { for (file of handlers) { require(`./config/handlers/${file}`)(client); } await client.handleCommands(commandFolders); await client.handleInteractions(interactionFolders); await client.handleEvents(eventFiles); client.login(token); })();
- ping命令的execute方法前面加await,避免未捕获的报错:
module.exports = { name: "ping", async execute(message, args, client) { await message.channel.send(`Pong ${client.ws.ping}`) } }
内容的提问来源于stack exchange,提问作者lvlahraam
相关产品推荐
相关产品推荐

