Discord.js开发:MessageEmbed部分set配置未生效问题
Discord可爱动物表情包机器人Embed属性失效问题修复
问题表现
开发Discord可爱动物图片类机器人时,调用cute命令后机器人返回的Embed仅展示description字段内容,预先配置的color颜色、image图片属性均未正常渲染。
- 初始代码截图:

- 异常运行效果截图:

问题根因
一共存在3处代码错误,共同导致了异常:
- 异步时序逻辑错误:
randomPuppy是异步网络请求方法,原代码在请求回调尚未执行、还未给Embed对象配置color和image属性时,就提前执行了message.channel.send(cuteEmbed)发送消息,后续回调内对Embed的修改根本无法同步到已经发出的消息上。 - 字符串插值语法错误:原代码写的
cuteEmbed.setImage('${cuteurl}')使用单引号包裹模板字符串,JS不会对单引号内的${变量}做替换,最终传入setImage的是固定字符串${cuteurl}而非真实图片地址,就算时序正确图片也无法加载。 - 数组下标计算逻辑错误:原代码随机取subreddit的写法
Math.floor(Math.random()*reddit.length -1)有概率计算出下标值-1,导致无法取到合法的子版块名称,拉取图片失败。
修复后完整代码
const { MessageEmbed } = require('discord.js'); const randomPuppy = require('random-puppy'); module.exports = { name: 'cute', description: 'Embeds pictures pulled from listed subreddits', // 改为async函数,方便处理异步请求 async execute(message, args, Discord){ const reddit = [ "aww", "puppies", "toebeans" ] // 修复随机下标计算逻辑 const subreddit = reddit[Math.floor(Math.random()*reddit.length)]; const cuteEmbed = new MessageEmbed() .setDescription("Some cute animals to blow away your anxieties!"); // 等待图片拉取完成后再配置Embed属性 const imgUrl = await randomPuppy(subreddit); cuteEmbed.setColor('#91B2C7'); // 修复模板字符串语法,使用反引号包裹 cuteEmbed.setImage(`${imgUrl}`); // 适配discord.js v13+版本的Embed发送格式 message.channel.send({ embeds: [cuteEmbed] }); } }
补充说明:如果你使用的是v13及以上版本的discord.js,发送Embed时必须传入
{ embeds: [embed实例] }格式的参数,直接传入Embed对象也会导致属性渲染异常。
内容的提问来源于stack exchange,提问作者RespawnTheory
相关产品推荐
相关产品推荐

