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

Discord.js如何实现指令后跟随任意文本时仍可正常触发功能

问题根源

  1. 你修改后的代码还保留了最初的完全匹配判断逻辑,只有消息内容完全等于!price/!ping才能进入后续处理块,带后缀内容的消息直接被过滤了
  2. 切掉前缀后得到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:39:03