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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:17:47