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

如何修复Discord.js v14中的Meme命令并实现无报错发送?

Discord.js v14 Meme 斜杠命令报错修复

问题代码

const { SlashCommandBuilder, EmbedBuilder, Embed } = require("discord.js");

module.exports = {
  data: new SlashCommandBuilder()
    .setName("meme")
    .setDescription("send meme"),
  async execute(interaction, client) {
    const url = await fetch("https://ivall.pl/memy");
    const image = await url.json();

    const embed = new EmbedBuilder().setImage(image);

    await interaction.reply({
      embeds: [embed],
    });
  },
};

报错原因分析

核心错误有三点:

  • 响应解析方式错误:目标接口返回纯文本格式的图片链接,而非JSON结构,使用response.json()会触发解析失败报错。
  • fetch API 兼容性问题:Node.js v18 以下版本未内置fetch,直接调用会抛出ReferenceError;即使是 v18+ 版本,原代码也未处理请求失败的异常情况。
  • 存在冗余代码:导入了未使用的Embed模块。

修复方案

方案1:适配 Node.js v18+(内置fetch)

const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");

module.exports = {
  data: new SlashCommandBuilder()
    .setName("meme")
    .setDescription("发送随机梗图"),
  async execute(interaction) {
    try {
      const response = await fetch("https://ivall.pl/memy");
      // 检查请求是否成功
      if (!response.ok) throw new Error(`请求失败:${response.status}`);
      
      // 接口返回纯文本链接,用text()解析而非json()
      const imageUrl = await response.text();
      
      const embed = new EmbedBuilder()
        .setImage(imageUrl)
        .setColor("#Random"); // 可选:添加Embed颜色优化视觉效果

      await interaction.reply({ embeds: [embed] });
    } catch (error) {
      console.error(error);
      // 发送私有错误提示,避免影响频道观感
      await interaction.reply({ content: "获取梗图失败,请稍后再试!", ephemeral: true });
    }
  },
};

方案2:适配 Node.js v17 及以下版本

  1. 先安装兼容的fetch依赖:
npm install node-fetch@2
  1. 修改代码:
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const fetch = require("node-fetch"); // 导入node-fetch替代内置fetch

module.exports = {
  data: new SlashCommandBuilder()
    .setName("meme")
    .setDescription("发送随机梗图"),
  async execute(interaction) {
    try {
      const response = await fetch("https://ivall.pl/memy");
      if (!response.ok) throw new Error(`请求失败:${response.status}`);
      
      const imageUrl = await response.text();
      
      const embed = new EmbedBuilder()
        .setImage(imageUrl)
        .setColor("#Random");

      await interaction.reply({ embeds: [embed] });
    } catch (error) {
      console.error(error);
      await interaction.reply({ content: "获取梗图失败,请稍后再试!", ephemeral: true });
    }
  },
};

关键修改点

  • 删除未使用的Embed导入,精简代码
  • 将response.json()改为response.text(),匹配接口返回格式
  • 添加全局错误捕获,避免命令崩溃并给出友好提示
  • 针对不同Node.js版本提供了适配方案
  • 新增Embed颜色设置(可选优化)

内容的提问来源于stack exchange,提问作者Opzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:18:54