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

添加$kick命令后Discord.js机器人失效,新手求修复方案

修复你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:42:45