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
相关产品推荐
相关产品推荐

