Discord彩虹六号查询Bot报错:TypeError: Cannot read property '0' of undefined
解决Discord机器人查询R6等级时的TypeError问题
你遇到的TypeError: Cannot read property '0' of undefined主要有两个原因:一是命令解析逻辑出错,导致传递给API的用户名可能无效;二是没有处理API返回无结果的情况,直接访问了json.results[0],而当查询不到用户时json.results会是undefined。
我帮你把代码修正并优化了,同时加上了错误处理逻辑:
client.on('message', async message => { const prefix = '!level'; // 过滤机器人消息和非前缀开头的消息 if (!message.content.startsWith(prefix) || message.author.bot) return; // 正确解析用户输入的用户名:去掉前缀后清理空格 const targetUsername = message.content.slice(prefix.length).trim(); // 如果用户没输入用户名,给出提示 if (!targetUsername) { return message.channel.send('请输入要查询的Uplay用户名,格式:!level 你的用户名'); } const fetch = require('node-fetch'); try { // 用encodeURIComponent处理用户名,避免特殊字符破坏URL const res = await fetch(`https://r6tab.com/api/search.php?platform=uplay&search=${encodeURIComponent(targetUsername)}`); const json = await res.json(); // 检查API返回的结果是否有效 if (!json.results || json.results.length === 0) { return message.channel.send('找不到该用户,请检查用户名是否正确!'); } // 成功获取到数据时发送等级 message.channel.send(`Dein Level ist: ${json.results[0].p_level}`); } catch (error) { // 捕获网络请求或JSON解析错误 console.error('查询R6等级时出错:', error); message.channel.send('查询失败,请稍后重试!'); } });
关键修改点说明:
- 修复命令解析:移除了无效的
level.shift(level是字符串,不是数组,shift方法根本不生效),改用trim()清理输入的空格,确保用户名传递正确。 - 添加参数校验:当用户只输入
!level没带用户名时,主动提示格式要求。 - URL安全处理:用
encodeURIComponent()包裹用户名,避免用户名里的特殊字符(比如空格、点号)导致API请求失败。 - 结果有效性检查:先判断
json.results是否存在且有内容,再访问索引0的属性,从根源避免undefined报错。 - 全局错误捕获:用
try/catch处理网络请求失败、JSON解析失败等意外情况,给用户友好提示的同时方便你排查问题。
另外注意:确保你已经安装了node-fetch依赖(执行npm install node-fetch),如果你的Discord.js是v13及以上版本,需要安装node-fetch@2版本(因为v3是ESM模块,CommonJS环境下兼容性有问题)。
内容的提问来源于stack exchange,提问作者AroPix ツ
相关产品推荐
相关产品推荐

