如何避免Discord皮肤查询机器人因输入错误报错?
解决Discord机器人皮肤查询拼写错误报错问题
你的问题核心在于:当输入的皮肤名称不存在时,find()方法会返回undefined,此时直接访问.name、.tier这类属性就会触发TypeError。而且你重复调用了四次Object.values(info.skins).find(...),既浪费性能也容易出现不一致的问题。
下面是修复后的完整代码,我做了这些针对性优化:
- 一次性完成皮肤匹配查找,避免重复遍历
- 新增皮肤存在性检查,不存在时给用户友好提示并终止流程
- 用解构赋值提取属性,让代码更简洁
- 优化输入处理,兼容用户输入前后带空格的情况
if (msg.content.startsWith('LB skin')) { if (msg.author.bot) return; // 防止机器人回复自身 const inputSkinName = msg.content.slice(8).trim(); // 去除输入前后的多余空格 if (!inputSkinName) return msg.reply('Please give me a valid skin!'); const info = database; // 你的JSON文件数据 // 仅执行一次查找,统一处理大小写匹配 const matchedSkin = Object.values(info.skins).find(skin => skin.name.toLowerCase() === inputSkinName.toLowerCase() ); // 检查是否找到匹配的皮肤,没找到就提示用户 if (!matchedSkin) { return msg.reply(`Sorry, I couldn't find a skin named "${inputSkinName}". Please check your spelling and try again!`); } // 从匹配到的皮肤对象中解构提取所需属性 const { name: Name, tier: Tier, weapons: Weapons, event: Event, game_version: Game_version } = matchedSkin; const embed = new Discord.MessageEmbed() .setColor('#0099ff') .setTitle('Leak info:') .setAuthor('LeakBot#8631', 'https://cdn.discordapp.com/avatars/779616585001861120/d8c6dd64ac92ec5ee5a1a893578722c3.png?size=256', 'https://www.paypal.com/paypalme/LeakBot') .setDescription(inputSkinName) .addFields( { name: 'Name:', value: Name , inline: true }, { name: 'Tier:', value: Tier, inline: true }, { name: 'Weapons:', value: Weapons, inline: true }, { name: 'Event:', value: Event, inline: true }, { name: 'Game version:', value: Game_version, inline: true }, { name: '\u200B', value: '\u200B', inline: true }, ) .setTimestamp() .setFooter('Created by pitched_mobile', 'https://cdn.discordapp.com/icons/539804475150434314/e22de33df46a9022b41817bfb732c9b3.jpg'); msg.channel.send(embed); }
关键改进细节:
- 减少重复操作:只遍历一次皮肤数组完成匹配,比四次遍历的效率高很多
- 容错处理:提前拦截不存在的皮肤输入,彻底避免属性访问报错
- 输入兼容性:
trim()处理能应对用户不小心输入的前后空格,减少不必要的匹配失败 - 代码可读性:对象解构让属性提取的逻辑更清晰,后续维护也更方便
内容的提问来源于stack exchange,提问作者pitched mobile
相关产品推荐
相关产品推荐

