You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:58:14