从 PokeAPI for DiscordBot 以 JSON 格式显示 JS 对象

Posted

技术标签:

【中文标题】从 PokeAPI for DiscordBot 以 JSON 格式显示 JS 对象【英文标题】:Displaying an JS Object in JSON from PokeAPI for DiscordBot 【发布时间】:2021-10-12 05:44:15 【问题描述】:

我正在尝试开发我的 discord 机器人并从 PokeApi 获取信息,特别是 pokemon 的移动列表。我有以下代码,但我正在努力弄清楚如何获取每个口袋妖怪的移动列表。

client.on('message',(async message =>
    const args = message.content.toLowerCase().slice(poke.prefix.length).split(/ +/);
    if(!message.content.startsWith(poke.prefix))return;
    if(args[0] === "api")
        const fetch = require ('node-fetch');
        fetch('https://pokeapi.co/api/v2/pokemon/25')
        .then(res => res.json())
        .then(data => message.channel.send(data.name.moves.move.name))
        .catch(err => message.reply('that spell does not exist!'));))

现在我知道我在这里指定了一个特定的口袋妖怪(第 25 号),这很好,因为我可以稍后更改它,但这似乎是让我退缩的部分:

.then(data => message.channel.send(data.name.moves.move.name))

还有一种干净的方法来创建包含数据的嵌入。我必须创建一个包含信息的变量还是可以使用“res”?

非常感谢任何帮助或指导!谢谢!

【问题讨论】:

我自己查看 API 响应,看起来这些移动将在 data.moves(一个数组)下,然后其中的每个项目都有一个 .name attr。这就是你遇到的所有问题吗? 【参考方案1】:

您从 API 中分割数据的方式不正确。响应中有没有data.name.moves.move.name,所以读取它会导致如下错误:

TypeError: Cannot read property 'move' of undefined

相反,响应看起来更像以下内容(仅显示相关位):


  "name": "pikachu",
  "moves": [
    
      "move": 
        "name": "mega-punch",
        "url": "https://pokeapi.co/api/v2/move/5/"
      
    ,
    
      "move": 
        "name": "pay-day",
        "url": "https://pokeapi.co/api/v2/move/6/"
      
    ,
    ...
  ]

因此,根据您想要对这些动作执行的操作,您需要将一系列动作调整为您想要的格式。例如,要返回以逗号分隔的移动列表,请尝试以下操作:

fetch('https://pokeapi.co/api/v2/pokemon/25')
  .then(res => res.json())
  .then(data => 
    // Convert to `string[]` of move names
    const moves = data.moves.map(moveData => moveData.move.name);
    // Send message with a comma-separated list of move names
    message.channel.send(moves.join(','));
  );

就创建嵌入而言,按照Embed Structure documentation 构建这些是相当容易的:

fetch('https://pokeapi.co/api/v2/pokemon/25')
  .then(res => res.json())
  .then(data => 
    // Convert to `string[]` of move names
    const moves = data.moves.map(moveData => moveData.move.name);
    // Send message with embed containing formatted data
    message.channel.send(
      embeds: [
        // Set embed title to 'pikachu'
        title: data.name,
        // Add embed field called 'moves', with comma-separated list of move names
        fields: [
          name: 'Moves',
          value: moves.join(','),
        ],
      ],
    );
  );

【讨论】:

以上是关于从 PokeAPI for DiscordBot 以 JSON 格式显示 JS 对象的主要内容,如果未能解决你的问题,请参考以下文章

拆分 URI 并在 C# PokeApi Blazor WASM.net 5 中获取数字

PokeAPI 没有响应

如何从VUE中的另一个API加载其他JSON数据?

如何在 pokeAPI 中获取有关 pokemon 的详细信息

text PokeAPI

从 DiscordBot CommandService 中删除命令