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

Discord.js开发报错:ReferenceError: command is not defined求助

嘿,刚入门discord.js碰到这种报错太正常了,我来帮你把问题拆解开解决!

问题核心分析

你遇到的UnhandledPromiseRejectionWarning: ReferenceError: command is not defined,本质是代码里尝试使用一个叫command的变量,但这个变量根本没被定义就直接调用了。结合你输入-spam命令触发报错的情况,问题大概率出在命令处理逻辑部分;另外控制台没输出"Ready!",则是因为ready事件的代码可能没写对,或者邀请链接的输出时机不对导致代码阻塞。

分步修复方案

1. 先让"Ready!"正常输出

你说控制台停留在邀请链接日志,大概率是把邀请链接的代码写在了ready事件外面——这时候机器人还没完成初始化,client.user是未定义状态,代码自然卡住了。把邀请链接移到ready事件里即可:

client.on('ready', () => {
  console.log('Ready!');
  // 机器人初始化完成后再输出邀请链接
  console.log(`邀请链接:https://discord.com/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot`);
});

2. 修复command未定义的报错

在处理消息事件时,你需要先从消息内容里提取出命令名称,明确定义command变量,才能进行后续的命令判断。举个新手常用的正确写法:

client.on('messageCreate', async message => {
  // 过滤掉非前缀开头的消息,以及机器人自己发的消息
  if (!message.content.startsWith('-') || message.author.bot) return;

  // 提取命令:去掉前缀后分割成数组,取第一个元素作为命令名
  const args = message.content.slice(1).trim().split(/ +/);
  const command = args.shift().toLowerCase(); // 这里才是定义command变量的关键!

  // 现在就能正常判断spam命令了
  if (command === 'spam') {
    // 这里写你的spam命令逻辑,比如循环发消息
    for (let i = 0; i < 5; i++) {
      await message.channel.send('这是一条测试垃圾消息!');
    }
  }
});
完整可运行示例代码

把上面的修复点整合起来,完整代码如下:

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({ 
  intents: [
    GatewayIntentBits.Guilds, 
    GatewayIntentBits.GuildMessages, 
    GatewayIntentBits.MessageContent // 必须开启这个权限才能读取消息内容,discord.js v14+要求
  ] 
});

client.on('ready', () => {
  console.log('Ready!');
  console.log(`邀请链接:https://discord.com/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot`);
});

client.on('messageCreate', async message => {
  if (!message.content.startsWith('-') || message.author.bot) return;

  const args = message.content.slice(1).trim().split(/ +/);
  const command = args.shift().toLowerCase();

  if (command === 'spam') {
    // 用try/catch包裹异步操作,避免出现未处理的Promise拒绝警告
    try {
      for (let i = 0; i < 3; i++) {
        await message.channel.send('Spam测试消息!');
      }
    } catch (error) {
      console.error('执行spam命令出错:', error);
      message.reply('执行命令时出问题啦!');
    }
  }
});

// 替换成你的机器人Token
client.login('YOUR_BOT_TOKEN_HERE');

额外提醒

别忘了去Discord开发者后台的Bot选项卡里,开启Message Content Intent这个特权权限——不然机器人读不到消息内容,所有命令都会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:22