Discord机器人API获取动漫引用的两个技术问题求助
解决方案
问题1:处理Pending状态的Promise,避免JSON.stringify返回{}
直接对pending状态的Promise执行JSON.stringify会得到{},因为Promise本身是一个对象,未resolved时没有可序列化的有效数据。你需要等待Promise完成(状态变为resolved)后再执行序列化,有两种常用方式:
方式1:使用async/await(更直观)
把获取引用的逻辑封装成异步函数,通过await等待API请求完成后再处理数据:
async function fetchAnimeQuote() { // 发起API请求并等待响应 const res = await fetch('你的动漫引用API地址'); // 解析响应为JSON格式 const rawQuote = await res.json(); // 此时rawQuote已经是API返回的有效数据,再执行序列化 return JSON.stringify(rawQuote); }
方式2:使用Promise链式调用(兼容旧环境)
如果你的环境不支持async/await,可以用.then()链式处理:
function fetchAnimeQuote() { return fetch('你的动漫引用API地址') .then(res => res.json()) // 等待解析JSON .then(rawQuote => JSON.stringify(rawQuote)); // 序列化已获取的数据 }
调用这个函数时,同样需要等待它完成:比如在命令处理里用await fetchAnimeQuote()或者.then(quote => { ... })。
问题2:每次触发命令都获取新引用
你之前的代码应该是在机器人启动时(比如client.login()之前)调用了一次获取引用的逻辑,导致只会生成一次数据。解决方法是把获取引用的逻辑放到命令的处理函数内部,每次用户触发命令时才发起新的API请求:
以Discord.js v14为例,命令处理逻辑示例:
// 监听命令交互 client.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand()) return; // 匹配你的引用命令(比如命令名为anime-quote) if (interaction.commandName === 'anime-quote') { // 每次触发命令时,重新调用获取引用的函数 const newQuote = await fetchAnimeQuote(); // 回复用户 await interaction.reply(newQuote); } });
这样用户每发一次命令,机器人都会重新请求API获取新的随机引用,而不是复用启动时的旧数据。
内容的提问来源于stack exchange,提问作者Jivesh Kalra
相关产品推荐
相关产品推荐

