discord.js开发Discord机器人eHP命令触发后无响应问题求助
问题原因
- 主文件与命令模块的
run函数传参顺序不匹配
主文件调用命令时的参数顺序是command.run(message, args, client),但命令模块定义的run接收顺序是async run (client,message),参数错位导致命令模块内拿到的message对象实际是参数数组,不存在content、reply等属性和方法,所有逻辑都无法执行。
- 主文件与命令模块的
- 命令名大小写不匹配
主文件对触发命令做了toLowerCase()处理,而命令模块配置的name为大写的eHP,无法匹配到对应的命令,直接终止执行。
- 命令名大小写不匹配
- 命令模块内多余的触发判断
主文件已经完成了命令前缀、命令存在性的校验,命令模块内不需要再加if(message.content.startsWith("!eHP"))的判断,加上之后反而因为参数错位永远无法满足条件。
- 命令模块内多余的触发判断
- 语法错误与逻辑漏洞
命令模块末尾多了一个多余的闭合大括号,会抛出语法错误;且数值校验失败后没有加return终止执行,会继续输出错误的计算结果。
- 语法错误与逻辑漏洞
- 参数读取逻辑冗余错误
主文件已经将命令后的参数拆分存入args数组(已经去除了命令前缀和命令名),命令模块不需要重新拆分message.content,原参数索引对应错误,无法读取正确的数值。
- 参数读取逻辑冗余错误
修复方案
1. 修改命令模块代码
替换为以下内容:
module.exports = { name: 'ehp', // 改为全小写,适配主文件的toLowerCase处理 async run (message, args, client) { // 修正参数顺序和主文件调用对应 // 直接用主文件处理好的args数组,不用重新拆分 // args格式:用户输入!ehp def 55 hp 42时,args = ["def", "55", "hp", "42"] let defenseValue = args[1]; let hpValue = args[3]; // 转换为数值 defenseValue = parseFloat(defenseValue); hpValue = parseFloat(hpValue); if(isNaN(defenseValue) || isNaN(hpValue)) { if(isNaN(defenseValue)) { message.reply(`defense valeur doit être nombre, reçu: "${args[1]}"`); } else { message.reply(`hp valeur doit être nombre, reçu: "${args[3]}"`); } return; // 校验失败直接终止后续逻辑 } // 执行计算 const resultat = (((defenseValue * 3.5 ) + 1140) * hpValue) / 1000; // 返回结果 message.reply(`resultat pour => def: ${defenseValue}, hp: ${hpValue} égal: ${resultat}`); } }
2. 主文件无需修改,保持原有逻辑即可
触发示例
发送消息!ehp def 55 hp 42即可得到对应计算结果。
内容的提问来源于stack exchange,提问作者victor
相关产品推荐
相关产品推荐

