如何修复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()会触发解析失败报错。 fetchAPI 兼容性问题: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 及以下版本
- 先安装兼容的
fetch依赖:
npm install node-fetch@2
- 修改代码:
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
相关产品推荐
相关产品推荐

