
本文详解如何利用 Discord.js 的 ready 事件,在机器人成功连接并就绪后,立即向指定文本频道发送格式美观的 Embed 消息,并提供兼容 v14 的现代写法及关键注意事项。
本文详解如何利用 discord.js 的 `ready` 事件,在机器人成功连接并就绪后,立即向指定文本频道发送格式美观的 embed 消息,并提供兼容 v14 的现代写法及关键注意事项。
在 Discord.js 中,client.on('ready') 是监听机器人完成登录、缓存初始化完毕并进入就绪状态的核心事件。此时若直接调用 client.channels.cache.get() 发送消息,需确保目标频道已被缓存(通常为服务器内可见频道),且代码语法必须合法——原问题中将 const embed = ... 声明写在对象字面量内部属于语法错误,且旧版 Discord.MessageEmbed 在 v14+ 已被 EmbedBuilder 取代。
✅ 正确实现(适配 Discord.js v14+):
const { EmbedBuilder } = require('discord.js');
client.on('ready', () => {
console.log(`✅ ${client.user.tag} 已上线!`);
const targetChannel = client.channels.cache.get('YOUR_CHANNEL_ID');
if (!targetChannel) {
console.error('❌ 错误:未找到指定频道 ID,请检查是否拼写正确,或确认机器人已加入该服务器且拥有查看权限。');
return;
}
const embed = new EmbedBuilder()
.setTitle('Comandi Principali:')
.setDescription('以下是常用指令速查表')
.setColor(0x0099ff) // 推荐使用十六进制数值(如 0x0099ff)或 CSS 颜色名(如 'Blue'),避免使用 "Random"
.setTimestamp()
.setFooter({ text: 'Bot Status • Online' });
targetChannel.send({ embeds: [embed] })
.catch(err => console.error('❌ 发送 Embed 失败:', err));
});
⚠️ 关键注意事项:
-
频道 ID 必须为字符串:即使 ID 全是数字,也务必用引号包裹(如
'123456789012345678'),否则会被解析为数字导致cache.get()返回undefined; -
权限校验不可少:确保机器人在目标频道具备
View Channel和Send Messages权限;若频道位于其他服务器,还需确认机器人已被邀请至该服务器; -
缓存非万能:
client.channels.cache仅包含当前客户端已知的频道(通常为机器人所属服务器的公开频道)。若需跨服务器或确保频道存在,建议配合fetch()使用(需启用gateway.intents中的Guilds和GuildMessages); -
颜色值规范:
setColor()不接受"Random"字符串,可传入0xFF0000(红)、'#FF0000'或预设色名(如'Red'、'Green'); -
错误处理必加:网络波动或权限变更可能导致
send()失败,务必用.catch()捕获异常,避免静默失败。
? 进阶提示:如需在多个频道发送,可将频道 ID 存入数组,遍历调用 send();若希望 Embed 包含动态内容(如启动时间、服务器数量),可在 ready 回调中计算并注入字段。
通过以上结构化实现,你不仅能稳定触发上线通知,还能为后续运维监控与用户引导打下可靠基础。










