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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:03:32