升级到Discord.js v13后messageCreate事件异常,命令args参数未定义
修复方案
1. 命令参数undefined问题
原因
你调用命令run方法的参数顺序和命令定义的接收顺序不匹配:
- messageCreate.js中调用run时传参顺序为
bot, message, args共3个参数 - 命令文件中run函数的接收顺序为
bot, message, config, args共4个参数
多出来的config参数占了位置,导致第四个参数args没有对应传入值,始终为undefined。
修复方法
二选一即可:
- 把所有命令文件的run函数参数改为
async (bot, message, args) - 把messageCreate.js中调用run的代码改为
await cmd.run(bot, message, config, args),主动传入config参数
2. 机器人自身消息拦截不生效问题
原因排查&修复
- 缓存清理路径大小写不一致
你index.js中加载事件用的路径是./Events/${file},删除缓存用的路径是./events/${file},Node.js在大小写敏感的系统中会判定为两个不同路径,导致旧代码缓存没有被清除,实际运行的还是未修改的旧逻辑。
修复:统一路径大小写,将删除缓存代码改为:
delete require.cache[require.resolve(`./Events/${file}`)]
- 缺失v13要求的网关意图
Discord.js v13开始必须明确配置网关意图才能正常接收消息:
- 前往Discord开发者后台的机器人设置页面,开启
Message Content Intent权限 - 初始化bot时添加所需的消息相关意图,示例配置:
const { Client, Intents } = require('discord.js'); const bot = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.DIRECT_MESSAGES ] });
- 逻辑优化建议
可以将机器人消息拦截逻辑放到messageCreate处理函数的最开头,统一拦截所有机器人消息,无需分DM和非DM分支重复判断:
module.exports = async (bot, message) => { if(message.author.bot) return; // 后续其他逻辑 }
内容的提问来源于stack exchange,提问作者Ygroxie
相关产品推荐
相关产品推荐

