访问JSON数据集层级时触发Cannot read properties of undefined错误求助
问题:Discord机器人读取JSON文件时触发TypeError错误
开发Discord机器人时,意图读取scrambles.json文件中的魔方打乱数据,实现当交互命令为comp-scrambles时,获取指定魔方类型对应的scrams值并回复,但运行时触发TypeError: Cannot read properties of undefined (reading 'scrams')错误。
相关代码
if (interaction.commandName === 'comp-scrambles') { let datascrams = {}; fs.readFile('scrambles.json', 'utf8', function(err, rawData){ let datascrams = rawData; }) const replyscrams = datascrams[interaction.options.getString('cube')]['scrams']; interaction.reply(replyscrams); }
对应的JSON文件内容
{ "3x3": [ { "scrams": "das" } ] }
错误信息详情
C:\Users\Logan Alt\OneDrive\Desktop\KinchServer Comp Bot\src\index.js:479 const replyscrams = datascrams[interaction.options.getString('cube')]['scrams']; ^ TypeError: Cannot read properties of undefined (reading 'scrams') at Client.<anonymous> (C:\Users\Logan Alt\OneDrive\Desktop\KinchServer Comp
解决方案
1. 核心问题分析
报错原因有三个:
fs.readFile是异步操作,你在文件未读取完成时就执行了获取replyscrams的逻辑,此时datascrams还是初始空对象。- 读取到的
rawData是字符串,未转换为可访问属性的JavaScript对象。 - JSON中
3x3对应数组结构,直接访问['scrams']会因数组没有该属性而报错。
2. 修正代码(两种可选方式)
方式一:改用同步读取fs.readFileSync
if (interaction.commandName === 'comp-scrambles') { try { // 同步读取并解析JSON const rawData = fs.readFileSync('scrambles.json', 'utf8'); const datascrams = JSON.parse(rawData); // 获取魔方类型参数,读取对应数组的第一个对象的scrams值 const cubeType = interaction.options.getString('cube'); const replyscrams = datascrams[cubeType][0]['scrams']; interaction.reply(replyscrams); } catch (err) { console.error('读取或解析文件出错:', err); interaction.reply('获取打乱数据失败'); } }
方式二:将逻辑放入异步回调中
if (interaction.commandName === 'comp-scrambles') { fs.readFile('scrambles.json', 'utf8', function(err, rawData){ if (err) { console.error('读取文件出错:', err); return interaction.reply('获取打乱数据失败'); } // 解析JSON字符串为对象 const datascrams = JSON.parse(rawData); const cubeType = interaction.options.getString('cube'); // 从数组中取出第一个对象再访问scrams const replyscrams = datascrams[cubeType][0]['scrams']; interaction.reply(replyscrams); }) }
3. 额外建议
添加错误捕获逻辑,处理文件读取失败、参数不存在或JSON结构不匹配的情况,避免机器人因异常崩溃。
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

