You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js机器人命令参数问题:多空格文本截断求助

解决Discord机器人;say命令文本丢失的问题

嘿,我来帮你搞定这个;say命令的参数问题!你遇到的核心问题是参数解析时只提取了单个词,没有把后续所有文本合并成完整字符串,导致机器人只发送了"hi"而丢失后面的内容。

问题根源

你当前的代码应该是把输入按空格分割后,只取了第二个参数(比如args[1]),但用户输入的hi guys I'm a text是多个空格分隔的词,这些词会被拆成数组的多个元素,只取args[1]自然只能拿到第一个词"hi"。

修复方案

我们需要调整参数处理逻辑:先取出目标频道名,再把剩下的所有参数拼接成完整文本。下面是完整的代码示例(补全了你没贴完的消息监听逻辑):

const Discord = require('discord.js');
const bot = new Discord.Client({disableEveryone: true});

bot.on("ready", async () => {
  console.log(`Bot is ready! ${bot.user.username}`);
  // 你这里的genera...应该是generateInvite之类的?如果是邀请链接可以补全:
  // let link = await bot.generateInvite({ permissions: ['SEND_MESSAGES'] });
  // console.log(`Invite link: ${link}`);
});

bot.on("message", (message) => {
  // 忽略机器人消息和非前缀开头的消息
  if (!message.content.startsWith(';') || message.author.bot) return;

  // 拆分命令和参数:去掉前缀后按空格分割
  const args = message.content.slice(1).split(' ');
  const command = args.shift().toLowerCase();

  if (command === 'say') {
    // 1. 取出第一个参数:目标频道名
    const targetChannelName = args.shift();
    // 2. 把剩下的所有参数用空格拼接成完整文本
    const textToSend = args.join(' ');

    // 检查是否缺少必要参数
    if (!targetChannelName || !textToSend) {
      return message.reply('使用格式不对哦!正确用法:`;say 目标频道名 要发送的完整文本`');
    }

    // 查找服务器内的目标频道
    const targetChannel = message.guild.channels.cache.find(ch => ch.name === targetChannelName);
    if (targetChannel) {
      targetChannel.send(textToSend);
      message.reply(`已在${targetChannelName}频道发送消息!`);
    } else {
      message.reply(`找不到名为${targetChannelName}的频道,请检查频道名是否正确!`);
    }
  }
});

// 记得替换成你的机器人token
bot.login('YOUR_BOT_TOKEN');

关键优化点

  • args.shift():每次调用会取出数组的第一个元素,这里先取出频道名后,剩下的args就是所有文本内容
  • args.join(' '):把剩余数组元素用空格连接,完美还原用户输入的完整文本,不管有多少个词

进阶方案:用正则解析更可靠

如果担心频道名包含特殊字符(比如连字符、下划线),可以用正则表达式直接匹配频道名和后续文本,逻辑更清晰:

bot.on("message", (message) => {
  if (message.author.bot) return;
  // 正则匹配:;say 频道名 任意文本(频道名允许包含非空格的字符)
  const sayMatch = message.content.match(/^;say (\S+) (.+)$/);
  if (sayMatch) {
    const targetChannelName = sayMatch[1];
    const textToSend = sayMatch[2];
    // 后续的频道查找和发送逻辑和上面一致
    const targetChannel = message.guild.channels.cache.find(ch => ch.name === targetChannelName);
    if (targetChannel) {
      targetChannel.send(textToSend);
    } else {
      message.reply(`找不到频道${targetChannelName}!`);
    }
  }
});

这样修改后,你输入;say general hi guys I'm a text,机器人就会在general频道发送完整的hi guys I'm a text啦!

内容的提问来源于stack exchange,提问作者Eric Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:23:19