Discord JavaScript机器人输入meme指令无响应问题求助
Discord机器人meme模块无响应问题原因
- 核心监听逻辑未执行:你将全部消息响应逻辑封装在
asyncCall函数中,但代码中没有调用过该函数,导致机器人没有注册消息监听,所有指令都无法触发响应。
- 核心监听逻辑未执行:你将全部消息响应逻辑封装在
- 异步操作缺少
await关键字:fetch和res.json()都是异步方法,不加await拿到的返回值是Promise对象而非实际接口数据,执行时会直接抛出异常,由于你没有做错误捕获所以看不到报错。
- 异步操作缺少
- 变量名拼写错误:过滤NSFW内容时使用了未定义的
msg变量,实际上下文的消息对象命名为message,会触发引用错误中断代码执行。
- 变量名拼写错误:过滤NSFW内容时使用了未定义的
- 回调函数未标记async:message事件的回调函数是普通函数,内部使用
await关键字会直接报错,需要将回调函数标记为async。
- 回调函数未标记async:message事件的回调函数是普通函数,内部使用
- 模板字符串语法错误:构造Embed的url字段时使用单引号包裹变量模板,模板字符串需要用反引号包裹才能正确解析变量,生成的链接是无效的固定字符串。
- 接口字段调用错误:你请求的Imgur分区接口返回的帖子数据不存在
reddit字段,强行调用只能拿到undefined,且Embed的图片地址被写死为测试链接,即使前面逻辑正常也不会展示抓取到的meme。
- 接口字段调用错误:你请求的Imgur分区接口返回的帖子数据不存在
- 版本兼容问题:如果你使用的是discord.js v13及以上版本,
message事件已被官方废弃,需要替换为messageCreate事件才能正常监听到用户消息。
- 版本兼容问题:如果你使用的是discord.js v13及以上版本,
修复示例
第一步:调整监听注册逻辑
你可以直接删掉asyncCall函数包裹,或者在client.login之前调用asyncCall()。
第二步:修复meme分支逻辑
// 回调函数加async client.on("message", async function(message) { // 原有逻辑不变 case "Show me some memes": message.channel.send("MEMEY.....MEMEY.....MEMEY......\n") const subReddits = ["memes"]; const random = subReddits[Math.floor(Math.random() * subReddits.length)]; const url = `https://www.imgur.com/r/${random}/hot.json`; // 加await const res = await fetch(url); const json = await res.json(); // 把msg替换为message const posts = json.data.filter(f => message.channel.nsfw || !f.nsfw); if (!posts.length) return message.channel.send("No posts, maybe try in a nsfw channel"); const post = posts[Math.floor(Math.random() * posts.length)]; const MemeEmbed = { color: 0x0099ff, // 用反引号,取正确的imgur帖子链接 url: `https://imgur.com/${post.id}`, image: { // 用抓取到的图片地址 url: post.link, }, } message.channel.send({ embeds: [MemeEmbed] }); break; })
内容的提问来源于stack exchange,提问作者Captain Tiger
相关产品推荐
相关产品推荐

