discord.js embed无法生成Discord邀请链接问题求助
故障原因
代码隔天突然失效90%是依赖自动升级到了不兼容的大版本,结合代码写法判断,核心问题点如下:
discord.js升级到v14版本后,原MessageEmbed类已被移除、迁移至@discordjs/builders包下重命名为EmbedBuilder,旧导入方式会直接抛出「类不存在」的运行时错误,导致命令完全无响应。quick.db升级到v9版本后,db.all()方法的排序参数语法变更,旧的{ sort: ".data" }写法失效,会导致订单查询结果异常。- 原有逻辑存在固有缺陷:仅通过
members.cache判断用户是否在目标服务器,缓存未命中时会出现判断错误;邀请有效性判断逻辑错误,有效邀请的code属性永远不为null,原有判断永远不会触发失效标记;无有效订单时会返回空的嵌入内容,看起来和失效无区别。 - 异步逻辑混用
await和then/catch,加的1ms延时没有实际等待作用,存在状态同步异常的概率。
修复方案
方案1:快速回退兼容(不用改业务逻辑)
直接把依赖版本固定到兼容旧代码的版本,修改package.json里的依赖项后重新执行npm install即可:
"dependencies": { "@discordjs/builders": "^1.6.0", "discord.js": "^13.16.0", "quick.db": "^7.1.3" }
方案2:适配新版本依赖的修复后代码
如果要使用最新版依赖,替换原有代码为以下版本即可:
const { SlashCommandBuilder, EmbedBuilder } = require('@discordjs/builders'); const { QuickDB } = require('quick.db'); const db = new QuickDB(); const config = require('../Database/config.json'); module.exports = { data: new SlashCommandBuilder() .setName('farm') .setDescription('Join servers for coins!'), async execute(interaction, client) { await interaction.deferReply(); // 兼容新旧版本quick.db的查询写法 let orders = await db.all(`orders_`); // 按奖励值从高到低排序 orders.sort((a, b) => b.data - a.data); orders = orders.filter(async x => { if (x.data <= 0) return false; const guild = client.guilds.cache.get(x.ID.split("_")[1]); if (!guild) return false; // 强制拉取成员状态,不依赖缓存 try { await guild.members.fetch(interaction.user.id); return false; } catch { return true; } }); const embed = new EmbedBuilder() .setColor("Random") .setTitle('Farm!'); let hasValidOrder = false; for (let i = 0; i < orders.length; i++) { if (hasValidOrder) break; const id = orders[i].ID.split("_")[1]; const guild = client.guilds.cache.get(id); if (!guild) continue; const code = await db.get(`code_${id}`); let inviteValid = true; // 用try/catch统一处理异步错误 try { const link = await client.fetchInvite(`https://discord.gg/${code}`); if (!link?.code) inviteValid = false; } catch { inviteValid = false; } if (inviteValid) { const description = await db.get(`description_${id}`); embed.setDescription(`${guild.name} - ${description}`); hasValidOrder = true; } } // 无有效订单时给出提示 if (!hasValidOrder) { embed.setDescription("当前没有可加入的新服务器任务,请稍后再试"); } interaction.editReply({ embeds: [embed] }); }, };
排查建议
- 先查看运行控制台的报错日志,报错栈会直接定位到具体出错的代码行,版本不兼容导致的错误会明确提示「某某 is not a constructor」「某某 is not a function」。
- 如果用了npm/pnpm的自动版本升级(前缀),只要依赖发了大版本,下次装依赖就会自动升级到不兼容版本,后续可以把版本号前的去掉,锁定固定版本避免意外升级。
内容的提问来源于stack exchange,提问作者Do0ks
相关产品推荐
相关产品推荐

