Discord.js如何实现指令后跟随任意文本时仍可正常触发功能
问题根源
- 你修改后的代码还保留了最初的完全匹配判断逻辑,只有消息内容完全等于
!price/!ping才能进入后续处理块,带后缀内容的消息直接被过滤了 - 切掉前缀后得到的
cmd已经不带!符号,你还是判断cmd === "!price"自然匹配失败,导致command变量始终是初始的布尔值,调用时就会抛出「不是函数」的类型错误
修正后可用的完整代码
第一步:确保configtest.json里配置了前缀
{ "prefix": "!", // 保留你原来的其他配置项 }
第二步:替换主文件的消息监听逻辑
// Require the necessary discord.js classes const { Client, Intents } = require('discord.js'); const config = require("./configtest.json"); const ping = require("./commands/ping.js") const price = require("./commands/price.js") const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] }); //Commands client.on("messageCreate", (message) => { if (message.author.bot) return; // 先判断消息是不是以配置的指令前缀开头 if (!message.content.startsWith(config.prefix)) return; // 拆分指令名和后续参数 const args = message.content.slice(config.prefix.length).trim().split(/ +/g); const cmd = args.shift().toLowerCase(); // 匹配对应指令函数 let command = null; if (cmd === "price") command = price; if (cmd === "ping") command = ping; // 只有匹配到有效指令函数才执行 if (typeof command === 'function') { // 如果后续指令需要用到后缀参数,可以把args也传进去,比如command(message, args) command(message); } });
可选优化(后续加指令更方便)
可以用对象统一映射所有指令,不用每次加新指令都写新的if判断:
// 所有指令统一映射,后续加新指令只需要在这里加一行即可 const commands = { ping: require("./commands/ping.js"), price: require("./commands/price.js") } // 匹配指令的逻辑可以简化成一行 const command = commands[cmd];
如果指令需要用到后缀参数,只需要修改指令导出的函数接收参数即可,例如price.js可以写成:
module.exports = (message, args) => { // 发送!price btc usd时,args的值就是['btc', 'usd'] message.reply(`正在查询${args.join(' ')}的价格`).catch(e => console.log(e)); }
主文件调用指令的时候改成command(message, args)就能把参数传给指令处理函数。
内容的提问来源于stack exchange,提问作者RasmonT
相关产品推荐
相关产品推荐

