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

Discord Bot设置多字符指令前缀后无响应问题求助

问题排查与修复方案

核心问题1:消息前缀切片逻辑错误

你的消息事件处理代码中,判断消息是否匹配前缀用的是数据库存储的自定义前缀,但切除前缀时用的是全局默认前缀的长度:

  • 假设你默认前缀是!(长度1),自定义设置的前缀是!!(长度2)
  • 匹配时能正确识别!!test开头的消息,但切片时只切了1个字符,剩余内容变成!test,拆分出来的命令名是!test,自然匹配不到你注册的test命令,导致无响应。

修复方法:把slice的参数替换为自定义前缀的长度即可,修改后的消息事件代码如下:

let guildPrefixes = await Prefix.findOne({
      guildID: message.guild.id
    });
// 兼容没有自定义前缀的场景, fallback到全局默认前缀
const currentPrefix = guildPrefixes?.prefix || client.prefix;
if (message.content.startsWith(currentPrefix)) {
  const [cmdName, ...cmdArgs] = message.content
    .slice(currentPrefix.length) // 这里替换为自定义前缀的长度
    .trim()
    .split(/\s+/);
  const command = client.commands.get(cmdName);
  if (command) {
    command.run(client, message, cmdArgs);
  }
}

核心问题2:前缀更新逻辑参数错误

你的prefix.js中findOneAndUpdate的传参顺序完全错误,Mongoose的该方法参数规则是(查询条件, 要更新的内容, 可选配置),你现在把新前缀放到了查询条件里:

  • 只有当数据库中现存的前缀和你要设置的新前缀完全一致时,才能匹配到记录执行更新
  • 否则查询不到对应记录,更新操作不会生效,你看到的成功提示是假的,前缀实际还是旧值。
    同时你还有重复查询数据库的冗余逻辑,可以一并优化,修复后的prefix.js代码如下:
let newPrefix = args[0];
// 只查一次数据库即可
let guildPrefixes = await Prefix.findOne({
  guildID: message.guild.id
});
if (!guildPrefixes) {
  // 没有记录就新建
  guildPrefixes = await new Prefix({
    _id: mongoose.Types.ObjectId(),
    guildID: message.guild.id,
    prefix: newPrefix,
  })
  await guildPrefixes.save();
  message.channel.send(`Successfully set the guild Prefix to ${newPrefix}!`);
} else {
  // 有记录就更新,参数顺序不要写错
  await Prefix.findOneAndUpdate(
    { guildID: message.guild.id }, // 查询条件:只匹配服务器ID
    { prefix: newPrefix } // 要更新的内容
  );
  return message.channel.send(`Successfully updated the guild Prefix to ${newPrefix}!`);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:54:02