Discord.js机器人修改Reddit接口后仍同时发送两个子版meme的问题排查
异常原因定位
- 触发双图输出的核心原因是项目存在未清理的旧代码残留:开发初期跟着教程编写时,曾在主入口的message事件回调中,直接写入请求r/memes的meme处理逻辑;后续将逻辑抽离为独立指令模块时,没有彻底删除主文件中的旧代码段。触发meme指令时,旧逻辑和新模块逻辑会并行执行,分别向两个子版发起请求,最终输出两张不同来源的梗图。
- 次要可能诱因:命令存放目录中同时存在两个导出
name: 'meme'的模块文件(旧版请求r/memes、新版请求r/marvelmemes),且命令加载逻辑未做同名去重,导致指令触发时重复执行请求。 - 现有代码的潜在隐患:Embed实例在got请求外层定义,虽不会直接造成跨子版发图,但在并发触发指令时可能出现不同请求的内容串扰。
解决步骤
- 全局检索项目所有代码文件中的
r/memes字符串,删除所有和当前meme指令模块无关的旧请求逻辑、旧meme模块文件,确保项目内仅保留一份指向r/marvelmemes的meme实现。 - 调整meme模块的代码逻辑,将Embed实例初始化移入请求回调内部,补充Reddit接口要求的请求头与异常捕获逻辑,修改后可直接运行的代码如下:
const got = require('got'); module.exports = { name: 'meme', description: "send a meme", execute(message, args, Discord) { got('https://www.reddit.com/r/marvelmemes/random/.json', { headers: { 'User-Agent': 'MCU-Meme-Discord-Bot/1.0' } }).then(response => { // 每次请求独立初始化Embed,避免作用域串扰 const embed = new Discord.MessageEmbed() const content = JSON.parse(response.body); const post = content[0].data.children[0].data; // 自动跳过置顶、NSFW内容,保证输出符合服务器要求 if (post.stickied || post.over_18) return this.execute(message, args, Discord); const memeUrl = `https://reddit.com${post.permalink}`; embed.setTitle(post.title) embed.setURL(memeUrl) embed.setImage(post.url) embed.setColor('RANDOM') embed.setFooter(`👍 ${post.ups} 👎 ${post.downs} 💬 ${post.num_comments}`) message.channel.send(embed); }).catch(err => { console.error('梗图请求异常:', err); message.channel.send('梗图加载失败,请稍后重试'); }) } }
- 检查命令加载逻辑,确保每个命令名仅对应唯一的模块实例,避免重复注册导致的重复执行。
内容的提问来源于stack exchange,提问作者Anna C
相关产品推荐
相关产品推荐

