调用pokeapi获取宝可梦特性描述失败 如何正确提取对应返回字段
问题修复方案
核心错误原因
你对PokeAPI返回字段的读取逻辑有误:
data.flavor_text_entries本身是数组,每个数组元素才是包含flavor_text、language、version_group属性的单条描述对象- 你写的
data.flavor_text_entries.flavor_text[1]是直接读取数组本身的flavor_text属性,该属性不存在,必然返回undefined报错
修正逻辑步骤
- 从
flavor_text_entries数组中筛选你需要的语言版本的描述(英文对应en,简体中文对应zh-Hans) - 提取对应条目的
flavor_text字段,替换掉文本自带的换页符\f、换行符\n避免显示异常 - 增加兜底逻辑,避免目标语言无描述时程序报错
修正后代码片段
const fetch = require("node-fetch"); const Discord = module.require("discord.js"); module.exports = { name: "ability", aliases: ["abilities"], description: "Displays information for a given pokemon ability", category: "util", requiredArgs: ["query"], run: async (client, message, args) => { // 适配PokeAPI的特性名格式:全小写,空格替换为横杠 const query = args.join(" ").toLowerCase().replace(/\s+/g, '-'); if (!query) { // 原提示逻辑错误,该命令是查特性不是查宝可梦 return message.channel.send("请输入要查询的宝可梦特性名称"); } try { const res = await fetch( `https://pokeapi.co/api/v2/ability/${encodeURIComponent( query )}` ) if (!res.ok) throw new Error('接口返回异常') const data = await res.json(); // 筛选英文描述,要中文就把'en'换成'zh-Hans' const targetEntry = data.flavor_text_entries.find(item => item.language.name === 'en') // 兜底:无对应语言描述时取提示文本 const flavorText = targetEntry ? targetEntry.flavor_text.replace(/[\n\f]/g, ' ') : '暂无该特性的描述信息' let embed = new Discord.MessageEmbed() // 可选配置:显示中文特性名 .setTitle(`特性:${data.names.find(item => item.language.name === 'zh-Hans')?.name || data.name}`) .setDescription(`*${flavorText}*`) message.reply({ embeds: [embed] }); } catch(err) { console.log(err); message.reply('未找到对应特性的数据,请检查输入是否正确') } }, };
额外注意事项
- PokeAPI的特性查询入参仅支持特性的英文原名(全小写,空格替换为横杠)、数字ID,如果你需要支持中文特性名查询,需要自己维护中文名称到英文原名/ID的映射表
- 部分特性可能没有简体中文描述,可根据需要调整筛选的语言优先级
内容的提问来源于stack exchange,提问作者Temp 2875
相关产品推荐
相关产品推荐

