Discord.js机器人斜杠命令已注册但无法响应求助
Discord.js机器人斜杠命令执行失败:提示“The application did not respond”
在Replit平台使用Node.js开发Discord.js机器人,参考官方示例代码完成开发后,斜杠命令已成功注册并在Discord中可见,但执行时提示“The application did not respond”,无法正常工作。以下是相关代码及截图:
命令代码(commands/hi.js)
const { SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('hi') .setDescription('say hi'), async execute(interaction) { await interaction.reply('hi'); }, };
主文件代码(index.js)
const { Client, Events, GatewayIntentBits } = require('discord.js'); const token = process.env['TOKEN'] const clientId = process.env['APID'] const guildId = process.env['SID'] const client = new Client({ intents: [GatewayIntentBits.Guilds] }); // 部署命令部分 const { REST, Routes } = require('discord.js'); const fs = require('node:fs'); const commands = []; // 读取commands目录下的所有命令文件 const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js')); // 提取每个命令的data用于部署 for (const file of commandFiles) { const command = require(`./commands/${file}`); commands.push(command.data.toJSON()); } // 初始化REST模块 const rest = new REST({ version: '10' }).setToken(token); // 部署命令 (async () => { try { console.log(`开始刷新 ${commands.length} 个应用(/)命令。`); // 使用put方法全量更新服务器内的命令 const data = await rest.put( Routes.applicationGuildCommands(clientId, guildId), { body: commands }, ); console.log(`成功重新加载 ${data.length} 个应用(/)命令。`); } catch (error) { // 捕获并记录错误 console.error(error); } })(); client.on("ready", () => { console.log("机器人已上线!"); }) client.login(process.env['TOKEN']);
相关截图
- 项目结构:

- 命令已注册:

- 机器人配置:

- 机器人权限范围:

- 机器人权限:

问题原因
代码仅完成了斜杠命令的部署流程,但未监听Discord的交互事件。当用户触发斜杠命令时,Discord向机器人发送交互请求,但机器人没有对应的处理逻辑,导致超时提示“The application did not respond”。
解决方案
需要在index.js中补充两项核心逻辑:
- 将命令加载到客户端的命令集合中
- 监听
interactionCreate事件处理用户的命令交互
修改后的完整index.js代码
const { Client, Events, GatewayIntentBits, Collection } = require('discord.js'); const token = process.env['TOKEN'] const clientId = process.env['APID'] const guildId = process.env['SID'] const client = new Client({ intents: [GatewayIntentBits.Guilds] }); // 初始化命令集合,用于存储已加载的命令 client.commands = new Collection(); const { REST, Routes } = require('discord.js'); const fs = require('node:fs'); const commands = []; const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js')); for (const file of commandFiles) { const command = require(`./commands/${file}`); commands.push(command.data.toJSON()); // 将合法命令添加到客户端集合 if ('data' in command && 'execute' in command) { client.commands.set(command.data.name, command); } else { console.log(`[警告] ./commands/${file} 缺少必要的"data"或"execute"属性`); } } // 部署命令 const rest = new REST({ version: '10' }).setToken(token); (async () => { try { console.log(`开始刷新 ${commands.length} 个应用(/)命令。`); const data = await rest.put( Routes.applicationGuildCommands(clientId, guildId), { body: commands }, ); console.log(`成功重新加载 ${data.length} 个应用(/)命令。`); } catch (error) { console.error(error); } })(); client.on("ready", () => { console.log("机器人已上线!"); }) // 监听交互事件,处理用户触发的斜杠命令 client.on(Events.InteractionCreate, async interaction => { // 仅处理斜杠命令类型的交互 if (!interaction.isChatInputCommand()) return; // 根据命令名称从集合中获取对应的处理逻辑 const command = client.commands.get(interaction.commandName); if (!command) { console.error(`找不到名为 ${interaction.commandName} 的命令`); return; } try { // 执行命令的处理函数 await command.execute(interaction); } catch (error) { console.error(error); // 向用户反馈错误 await interaction.reply({ content: '执行命令时发生错误!', ephemeral: true }); } }); client.login(process.env['TOKEN']);
内容的提问来源于stack exchange,提问作者cat
相关产品推荐
相关产品推荐

