Discord机器人命令处理模块Ping命令Embed消息发送失败报错求助
解决Discord机器人Ping命令的DiscordAPIError问题
嘿,我看了你重构Discord机器人命令系统时遇到的Ping命令失效问题,报错提示「Cannot send an empty message」,这几个代码里的小疏漏导致了报错,我给你梳理清楚:
问题根源拆解
从报错信息里的embeds: undefined能看出来,发送消息时嵌入内容根本没正确传递,再扒拉你的代码,发现几个明显的坑:
- 未定义
channel变量就直接调用:你在ping.js里写了channel.send(),但这个channel既没声明也没从外部传入,相当于让机器人“往某个地方发消息”却没说具体是哪,自然触发空消息报错 ping.js无法获取客户端实例:你用了clients.ws.ping来获取API延迟,但clients是main.js里的局部变量,ping.js根本不知道它是什么,这会导致API延迟计算失败,甚至直接报错- 延迟计算逻辑搞反:
message.createdTimestamp - Date.now()会算出负数——消息创建时间肯定早于当前时间,应该反过来计算 main.js里的args未初始化:调用命令时传了args但没定义这个变量,虽然现在Ping命令用不上,但后续加带参数的命令肯定出问题
一步步修复方案
1. 修正ping.js代码
替换成以下内容,解决变量未定义和逻辑错误:
const Discord = require("discord.js"); module.exports = { name: 'ping', description: "Check bot and API latency", execute(message) { // 正确计算客户端延迟:当前时间 - 消息创建时间戳 const clientLatency = Date.now() - message.createdTimestamp; // 通过message.client获取客户端实例,拿到API延迟 const apiLatency = Math.round(message.client.ws.ping); const embed = new Discord.MessageEmbed() .setTitle("Pong! ") .setDescription(`Client Latency: **${clientLatency}ms**\nAPI Latency: **${apiLatency}ms**`) .setColor('RANDOM'); // 用message.channel获取当前消息所在频道,直接发送嵌入 message.channel.send({ embeds: [embed] }); } }
2. 优化main.js的命令触发逻辑
你原来的代码只处理-scp ping这一个固定命令,扩展性差,还漏了初始化命令集合和机器人登录,改成通用解析方式:
const config = require("./config.json"); const Discord = require('discord.js'); const clients = new Discord.Client({ intents: 14087 }); const prefix = "-scp "; const version = '1.6.6'; const packageJSON = require("./package.json"); const fs = require(`fs`); // 必须先初始化commands集合,否则无法存储命令 clients.commands = new Discord.Collection(); const commandFiles = fs.readdirSync('./commands/') .filter(file => file.endsWith('.js')); for (const file of commandFiles) { const command = require(`./commands/${file}`); clients.commands.set(command.name, command); } clients.on("messageCreate", (message) => { // 忽略机器人自身消息和非前缀开头的消息 if (!message.content.startsWith(prefix) || message.author.bot) return; // 解析命令和参数:切掉前缀后按空格拆分 const args = message.content.slice(prefix.length).trim().split(/ +/); const commandName = args.shift().toLowerCase(); // 命令不存在则直接返回 if (!clients.commands.has(commandName)) return; try { // 执行对应命令,传入message和args参数 clients.commands.get(commandName).execute(message, args); } catch (error) { console.error(error); message.reply('执行命令时出问题啦!'); } }); // 别忘了登录机器人!否则机器人无法启动 clients.login(config.token);
额外注意事项
- 确保机器人在目标服务器拥有「发送嵌入消息」的权限,否则代码正确也无法发送内容
- 检查
config.json里的机器人令牌token是否正确 - 确认intents设置覆盖了所需权限,14087已经包含常用的
GUILDS、GUILD_MESSAGES等意图,如有需求可调整
内容的提问来源于stack exchange,提问作者some kid playing js
相关产品推荐
相关产品推荐

