Discord Bot调用嵌入时报错:LIST_ITEM_VALUE_REQUIRED
Discord斜杠命令返回Embed时LIST_ITEM_VALUE_REQUIRED错误修复
报错信息:
data.embeds[0][LIST_ITEM_VALUE_REQUIRED]: List item values of ModelType are required
问题代码
特性查询函数
import { EmbedBuilder } from "discord.js" import fetch from "node-fetch" export const traitDescription = async (trait) => { console.log('here') let result let json = await fetch('https://temtem-api.mael.tech/api/traits').then() try { result = await json.json(); } catch (err) { result = null } console.log(result) var traitDes = false if (trait.toLowerCase() === 'traits') { return 0 } result.forEach((item) => { if (trait.toLowerCase() === item.name.toLowerCase()) { traitDes = item console.log(traitDes) } }) if (traitDes != false) { traitDes = new EmbedBuilder() .setTitle(`${traitDes.name}`) .setDescription(`${traitDes.effect}`) .setURL(`${traitDes.wikiUrl}`) } else { return 0 } console.log(traitDes) return traitDes }
index.js中interactionCreate事件调用代码
else if (commandName === 'trait') { let traitName = options.getString('traitname') const traitEmbed = traitDescription(traitName) if (traitEmbed === 0) { interaction.reply({ content: 'This is not a trait <:bruhvel:1100574618110132255>', ephemeral: true, }) } else { const messageId = interaction.reply({ embeds: [ traitEmbed ] }) } }
核心问题与修复方案
关键错误:未等待异步函数结果
traitDescription是异步函数,但调用时没有加await,导致traitEmbed拿到的是Promise对象,而非预期的EmbedBuilder实例或0。Discord.js无法识别Promise作为Embed参数,因此抛出ModelType相关错误。
修正后的代码
特性查询函数(优化版)
import { EmbedBuilder } from "discord.js" import fetch from "node-fetch" export const traitDescription = async (trait) => { console.log('here') let result = null; try { // 修正fetch调用,添加响应状态检查 const response = await fetch('https://temtem-api.mael.tech/api/traits'); if (!response.ok) throw new Error(`API请求失败,状态码:${response.status}`); result = await response.json(); } catch (err) { console.error('查询特性时出错:', err); return 0; } console.log(result) if (trait.toLowerCase() === 'traits') { return 0 } // 用Array.find替代forEach,逻辑更简洁高效 const traitItem = result.find(item => trait.toLowerCase() === item.name.toLowerCase()); if (traitItem) { return new EmbedBuilder() .setTitle(traitItem.name) .setDescription(traitItem.effect) .setURL(traitItem.wikiUrl); } else { return 0 } }
index.js调用代码(修正版)
else if (commandName === 'trait') { let traitName = options.getString('traitname') // 必须添加await,等待异步函数返回实际结果 const traitEmbed = await traitDescription(traitName) if (traitEmbed === 0) { interaction.reply({ content: 'This is not a trait <:bruhvel:1100574618110132255>', ephemeral: true, }) } else { // interaction.reply也是异步操作,建议添加await避免潜在问题 await interaction.reply({ embeds: [ traitEmbed ] }) } }
其他优化点
- 完善API请求错误处理,避免result为null时遍历报错
- 用
Array.find替代forEach查找特性,减少不必要的遍历 - 移除模板字符串的冗余使用(如
${traitItem.name}可直接用traitItem.name)
内容的提问来源于stack exchange,提问作者Michael Mumm
相关产品推荐
相关产品推荐

