那些让我各损失一周时间的 Discord.js 陷阱(希望你不必重蹈覆辙)

发布日期:2026-05-21 10:34:06   浏览量 :1
发布日期:2026-05-21 10:34:06  
1

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

我运营着一个人工智能 Discord 机器人构建平台,在过去一年中部署了 500 多个在线机器人。该服务接收纯英文描述,生成 discord.js 代码,并在 30 秒内将容器部署到生产环境。

这听起来很完美。但实际上并不完美。

我学到的大部分经验都来自凌晨三点的日志,当时某人的机器人停止响应消息,或者某个社区因为未记录的 Discord 行为而陷入沉默。以下是我希望在第一天就能拥有的清单。

  1. 缺少权限(错误代码 50013)通常与角色层级有关,而非权限本身

我第一次遇到这个问题时,花了两个小时审查机器人的权限整数配置。配置是正确的。但机器人仍然无法踢出任何人。

没有人用大字强调的一点是:discord.js 的权限受角色层级限制。即使机器人拥有“踢出成员”权限,如果目标用户的最高角色层级高于机器人的最高角色层级,机器人仍然无法踢出该用户。

client.on('interactionCreate', async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName !== 'kick') return;

const target = interaction.options.getMember('user');
const botMember = interaction.guild.members.me;

if (target.roles.highest.position >= botMember.roles.highest.position) {
return interaction.reply({
content: "我无法踢出该用户 — 其角色层级等于或高于我的角色层级。",
ephemeral: true,
});
}

await target.kick(interaction.options.getString('reason') ?? '未提供理由');
await interaction.reply(`已踢出 ${target.user.tag}。`);

});

在 Discord 中的修复方法:在“服务器设置” → “角色”中,将机器人的角色拖到需要管理的角色之上。这是导致“看似正常”的机器人无法工作的最常见原因。

  1. 未知交互(错误代码 10062)是一场 3 秒的竞态竞争

斜杠命令给你恰好 3 秒的时间来响应。如果在调用 reply() 之前执行任何等待中的数据库查询、第三方 API 调用或大型语言模型请求,你就会输掉这场竞态竞争。

错误做法:
const result = await callLLM(prompt); // 耗时 2.4 秒
await interaction.reply(result); // 报错 10062

正确做法:
await interaction.deferReply(); // 争取到 15 分钟时间
const result = await callLLM(prompt);
await interaction.editReply(result);

延迟回复模式是你需要一次性内化并从此不再受其困扰的知识之一。

  1. 意图标志是静默杀手

这一点很残酷,因为没有任何错误提示。你的机器人连接成功,显示为在线状态,注册了命令,但永远无法读取消息。

分为两部分:

  1. 在 Discord 开发者门户中,开启“消息内容意图”。
  2. 在你的客户端配置中列出它:

import { Client, GatewayIntentBits } from 'discord.js';

const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent, // ← 如果没有这个,message.content 将为空
GatewayIntentBits.GuildMembers,
],
});

如果跳过任何一步,message.content 将以空字符串形式到达,你的前缀命令看起来就会无缘无故地损坏。

  1. 旧消息的反应和编辑是部分数据

如果用户对机器人未观察到创建过程的消息(即比机器人会话更早的任何消息)做出反应,事件负载将是部分数据。在获取完整数据之前,访问 .content 将返回 null。

client.on('messageReactionAdd', async (reaction, user) => {
if (reaction.partial) {
try { await reaction.f

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部