添加$kick命令后Discord.js机器人失效,新手求修复方案
我帮你排查出了几个导致机器人崩溃的关键问题,咱们一步步来修复:
1. 未定义变量导致机器人崩溃(最核心问题)
你在第三个message事件回调里,参数命名是msg,但写踢人命令时却用了message这个未定义的变量——比如if (message.content.startsWith("$kick"))。JavaScript遇到未定义变量会直接抛出错误,导致整个机器人停止运行,这就是为什么添加这段代码后所有功能都失效的原因。
修复方法:把踢人代码里所有的message替换成msg,和回调参数保持一致。
2. 错误的消息内容判断逻辑
在-tworca命令里,你把整个Message对象和字符串"-tworca"做比较(if (msg === "-tworca")),这永远不会成立,应该改成判断消息的内容:
if (msg.content === "-tworca") {
3. 模板字符串语法错误
同样在-tworca命令里,你用双引号包裹了模板字符串,导致${botAuthor}和${botVersion}不会被解析成实际变量值。需要把双引号换成反引号:
msg.channel.send( `Autorem bota jest: **${botAuthor}**! Wersja *${botVersion}*. ` );
4. Discord.js 版本兼容修正(针对v12+)
如果你的Discord.js是v12或更高版本,还有两处API变化需要注意:
RichEmbed已被替换为MessageEmbed,所以开头的导入要改:const { Client, MessageEmbed } = require("discord.js");- 角色查找需要从缓存中获取,旧的
roles.find写法已经失效:// 替换原来的角色判断代码 if (!msg.member.roles.cache.find(r => r.name === "Admin")) { return msg.channel.send("你没有使用这个命令的权限!"); }
5. 增加边界情况处理
当用户执行$kick但没提到成员时,msg.mentions.members.first()会返回undefined,直接调用kick()会报错。另外还要确保机器人本身有踢人权限:
var member = msg.mentions.members.first(); if (!member) { return msg.channel.send("请指定要踢出的成员!"); } // 检查机器人是否有踢人权限 if (!msg.guild.me.hasPermission("KICK_MEMBERS")) { return msg.channel.send("我没有踢人的权限,请先给我分配权限!"); }
6. 合并多个message事件监听器
虽然多个监听器不会直接出错,但合并成一个会让代码更整洁,避免潜在的逻辑冲突。把所有命令逻辑放到同一个client.on("message")回调里。
修复后的完整代码
const { Client, MessageEmbed } = require("discord.js"); const chalk = require("chalk"); const { token, prefix } = require("../config/config.js"); const client = new Client(); client.on("ready", () => { console.log(chalk.red("Witamy w konsoli bota Island")); console.log(chalk.green(`Zalogowano jako ${client.user.tag}!`)); }); client.on("message", (msg) => { const { author, guild } = msg; if (author.bot || !guild) { return; } // 原有命令 if (msg.content === "-info") { msg.channel.send("Witam, jestem botem stworzonym przez Rewera"); } else if (msg.content === "-komendy") { msg.channel.send("Już wkrótce, zostaną dodane. Są w trakcie tworzenia"); } else if (msg.content === "-wersja") { msg.channel.send("Wersja: ALPHA 0.04"); } else if (msg.content === "-tworca") { const botAuthor = "Rewer"; const botVersion = "v1.1"; msg.channel.send( `Autorem bota jest: **${botAuthor}**! Wersja *${botVersion}*. ` ); } // 踢人命令 else if (msg.content.startsWith("$kick")) { // 检查用户权限 if (!msg.member.roles.cache.find(r => r.name === "Admin")) { return msg.channel.send("Nie masz uprawnień do użycia tej komendy!"); } // 获取提到的成员 const member = msg.mentions.members.first(); if (!member) { return msg.channel.send("Wskaż członka, którego chcesz wyrzucić!"); } // 检查机器人权限 if (!msg.guild.me.hasPermission("KICK_MEMBERS")) { return msg.channel.send("Nie mam uprawnień do wyrzucania członków!"); } // 执行踢人 member.kick() .then(() => { msg.channel.send(`:wave: ${member.displayName} został pomyślnie wyrzucony :point_right:`); }) .catch(err => { msg.channel.send("Nie udało się wyrzucić członka! Sprawdź moje uprawnienia i rangę użytkownika."); console.error(err); }); } }); // Error handler client.on("debug", () => {}); client.on("warn", () => {}); client.on("error", (err) => { console.error("Bot error:", err); }); client.login(token);
现在你可以把这段代码替换原来的代码,然后重启机器人试试。记得确保机器人有KICK_MEMBERS权限,而且执行命令的用户拥有Admin角色。
内容的提问来源于stack exchange,提问作者REWER

