Discord.js多参数处理问题求助:如何获取命令的完整参数内容
解决Discord.js中获取完整命令参数的问题
嘿,我完全懂你碰到的麻烦——用split(' ')分割命令内容时,每个空格都会把参数拆成单独的元素,结果只能拿到第一个单词,没法获取完整的句子或者带空格的参数。别担心,调整一下参数处理的逻辑就能搞定!
问题根源
你当前的代码里,args = message.content.slice(prefix.length).trim().split(' ')会把整个命令(比如$embed hello word :))拆成数组['embed', 'hello', 'word', ':)'],然后args.shift()拿走了'embed',剩下的args是['hello', 'word', ':)]。这时候你取args[0]自然只能拿到第一个单词。
解决方案
这里有两种简单的方法来获取完整的参数内容:
方法1:将参数数组重新拼接成字符串
既然args里已经包含了所有参数的单词,直接用join(' ')把它们合并成一个完整的字符串就行。修改你的命令判断逻辑,同时注意修正拼写错误:
client.on('message', async message => { if (!message.content.startsWith(prefix) || message.author.bot) return; const args = message.content.slice(prefix.length).trim().split(' '); const command = args.shift().toLowerCase(); console.log(message.content); if (command === 'embed') { // 改用command变量判断更灵活 const fullArgs = args.join(' '); const embesmess = new Discord.MessageEmbed() .setTitle(fullArgs || "无标题") // 加默认值避免空内容 .setColor(GREEN) .setDescription(fullArgs || "无内容") // 修正setdescription为setDescription message.channel.send(embesmess); } });
方法2:直接截取命令后的所有内容
这种方法更高效,不需要拆分再合并。先提取命令主体,找到命令名的位置后直接截取后续内容:
client.on('message', async message => { if (!message.content.startsWith(prefix) || message.author.bot) return; // 拿到去掉前缀后的完整命令内容 const commandBody = message.content.slice(prefix.length).trim(); // 拆分出命令名 const command = commandBody.split(' ')[0].toLowerCase(); // 截取命令名之后的所有内容,就是完整参数 const fullArgs = commandBody.slice(command.length).trim(); console.log(message.content); if (command === 'embed') { const embesmess = new Discord.MessageEmbed() .setTitle(fullArgs || "无标题") .setColor(GREEN) .setDescription(fullArgs || "无内容") message.channel.send(embesmess); } });
额外提示
- 注意你代码里的
setdescription拼写错误,应该是setDescription(首字母D大写),不然会触发报错! - 可以添加空值判断,当用户没有输入参数时,显示默认提示内容,避免嵌入消息出现空白。
- 对于
$kick这类需要完整理由的命令,用同样的方法就能获取用户输入的全部理由文本啦!
这样修改后,不管你输入$test 1 2还是$embed hello word :),机器人都能正确获取到完整的参数内容了。
内容的提问来源于stack exchange,提问作者AppleEater_
相关产品推荐
相关产品推荐

