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

Discord.js v11.5.1机器人无法执行命令问题求助

问题排查与修复方案

我仔细梳理了你的代码,发现几个关键问题导致机器人无法响应命令,咱们一步步拆解修复:

1. 核心逻辑倒置:消息过滤写反了

你第一个message事件里的这行代码完全搞反了逻辑:

if(!message.author.bot) return;

这行的意思是只要消息不是机器人发的,就直接终止处理——那用户发的命令根本不会被执行!正确写法应该是:

if(message.author.bot) return; // 忽略机器人自身发送的消息

2. 重复监听message事件导致冲突

你同时注册了两个message事件处理器,这会导致消息处理顺序混乱,甚至部分逻辑被覆盖不执行。建议把前缀查询的逻辑合并到同一个事件处理器里。

3. ownersOnly权限判断逻辑错误

当前代码的权限判断完全跳过了「检查用户是否在所有者列表」的步骤:只要命令标记了ownersOnly,就直接提示无权限,不管用户是不是真的所有者。正确逻辑应该是:如果命令是所有者专属,先验证用户ID是否在owners数组里,不在才拒绝执行。

4. messageDelete事件语法错误

messageDelete事件里的if(m.author.bot) return后面少了分号,会触发语法错误;另外重复多次require("fs")不够优雅,建议在顶部统一导入依赖。

修复后的完整代码

const { Client } = require('discord.js');
const fs = require('fs'); // 顶部统一导入fs,避免重复调用require
const bot = new Client();
const prefix = "%";
const owners = ['你的所有者ID']; // 记得填入实际的用户ID
const botToken = '你的机器人Token'; // 填入有效Token

bot.login(botToken);

bot.on('ready', () => { 
    console.log(`${bot.user.tag}: [${new Date(Date.now()).toUTCString()}]`); 
});

// 合并所有消息处理逻辑到一个事件处理器
bot.on("message", async (message) => { 
    // 忽略机器人消息
    if(message.author.bot) return; 

    // 处理前缀查询(非命令消息的特殊响应)
    if(message.content === "prefix") {
        return message.reply(`Prefix: ${prefix}`);
    }

    // 过滤非前缀开头的消息
    if(!message.content.startsWith(prefix)) return;

    // 解析命令与参数
    let args = message.content.slice(prefix.length).trim().split(/ +/g);
    let commandName = args.shift().toLowerCase();
    let commandPath = `./commands/${commandName}.js`;

    // 检查命令文件是否存在
    if(!fs.existsSync(commandPath)) return;
    const command = require(commandPath);

    // 处理所有者权限验证
    if(command.ownersOnly) {
        if(!owners.includes(message.author.id)) {
            return message.channel.send('You are not allowed to do that!');
        }
    }

    // 执行命令
    command.run(bot, message, args);
});

bot.on("messageDelete", (m) => { 
    if(m.author.bot) return; // 修复分号缺失问题
    const snipePath = __dirname + "/snipe.json";
    let snipeData = require(snipePath);
    snipeData[m.channel.id] = [
        m.author.id, 
        m.content, 
        m.attachments.first() ? m.attachments.first().proxyURL : undefined
    ];
    fs.writeFileSync(snipePath, JSON.stringify(snipeData, null, 2));
});

额外注意事项

  • 确保commands文件夹存在,且每个命令文件正确导出run函数,需要所有者权限的命令要添加ownersOnly: true属性;
  • 如果使用discord.js v13及以上版本,必须在Discord开发者门户的「机器人设置」中开启Message Content Intent,否则机器人无法接收消息内容;
  • 确认owners数组和botToken都已填入有效内容,不要留空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:52:51