在 JSON 中显示来自 PokeAPI for DiscordBot 的 JS 对象
Displaying an JS Object in JSON from PokeAPI for DiscordBot
我正在尝试使用我的 discord 机器人并从 PokeApi 获取信息,特别是宠物小精灵的移动列表。我有以下代码,但我正在努力弄清楚如何为每个宠物小精灵获取移动列表。
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.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(','),
}],
}],
});
});
我正在尝试使用我的 discord 机器人并从 PokeApi 获取信息,特别是宠物小精灵的移动列表。我有以下代码,但我正在努力弄清楚如何为每个宠物小精灵获取移动列表。
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.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(','),
}],
}],
});
});