You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:55:16