discord.js报错:Cannot read properties of undefined (reading 'length') 首次正常二次失败
Discord.js机器人执行!id指令第二次报错的修复方案
问题根源
报错Cannot read properties of undefined (reading 'length')是因为data变量为undefined时尝试访问其length属性,大概率是以下两个原因:
- Roblox API返回了非成功状态码(比如请求限流的429),此时响应结构中没有预期的
data字段,解构后data为undefined。 - 冗余代码
client.users.cache.clear();完全没必要——这是清理Discord用户缓存的操作,和Roblox API请求毫无关联,反而可能破坏机器人的内部缓存逻辑。
修复方案
- 移除无意义的缓存清理代码
- 增加请求状态检查,确保API响应正常
- 对
data的存在性和类型做前置校验 - 统一使用已引入的
axios处理请求(比原生fetch更简洁,自动处理状态码)
修改后的完整代码
const { Client, GatewayIntentBits } = require('discord.js') const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent], }); const axios = require('axios'); const PREFIX = "!"; client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); client.on('messageCreate', async (message) => { if (message.content.startsWith(PREFIX)) { const [command, username] = message.content .substring(PREFIX.length) .split(' '); if (command === 'id') { // 检查用户是否提供了查询的用户名 if (!username) { return message.channel.send('请提供要查询的Roblox用户名,格式:!id <用户名>'); } try { const lowercaseUsername = username.toLowerCase(); // 使用axios发送请求,自动处理非2xx状态码的错误 const response = await axios.get(`https://users.roblox.com/v1/users/search?keyword=${encodeURIComponent(lowercaseUsername)}`); const data = response.data; // 确保data是数组且不为空 if (!Array.isArray(data) || data.length === 0) { return message.channel.send(`找不到名为"${username}"的用户。`); } const { id } = data[0]; console.log(`用户"${username}"的Roblox ID是${id}。`); message.channel.send(`用户"${username}"的Roblox ID是${id}。`); } catch (error) { console.error('查询出错:', error.response?.data || error.message); // 针对限流情况给出友好提示 if (error.response?.status === 429) { return message.channel.send('请求过于频繁,请稍后再试。'); } message.channel.send(`查询用户"${username}"时出错。`); } } } }); client.login('Bot_Token');
额外优化说明
- 新增了用户名参数校验,避免用户仅输入
!id时的逻辑错误 - 针对Roblox API的限流机制(429状态码)做了专门提示
- 增强了错误日志的可读性,便于排查问题
内容的提问来源于stack exchange,提问作者FrostZer0
相关产品推荐
相关产品推荐

