Node.js如何读取JSON文件数据存入常量并解决取值undefined问题
问题根因
fs.readFileSync读取文件返回的是UTF-8格式的字符串,而非JSON对应的JS数组对象,直接遍历字符串时每轮拿到的item是单个字符,自然无法读取latjson等自定义属性。- 如果你已经调用
JSON.parse解析仍返回undefined,大概率是以下几个常见场景:- 路径错误:
./json/data.json是相对当前执行node命令的工作目录的路径,而非相对当前JS文件的路径,执行命令的目录不对时会读到空内容或不存在的文件,解析结果不符合预期 - JSON文件格式异常:比如数组最后一个对象末尾多了逗号、存在非法字符、带有UTF-8 BOM头,都会导致解析失败或结果异常
- 解析后未做类型校验:可能解析结果为对象而非数组,遍历逻辑自然无法拿到预期字段
- 路径错误:
修正后代码示例
const fs = require('fs'); const path = require('path'); function calcWeather1() { try { // 用绝对路径避免工作目录不一致的问题,__dirname为当前JS文件所在目录 const jsonPath = path.resolve(__dirname, './json/data.json'); // 读取原始文件内容 const rawData = fs.readFileSync(jsonPath, 'utf8'); // 去除首尾空格和可能存在的UTF-8 BOM头 const cleanData = rawData.trim().replace(/^\uFEFF/, ''); // 解析JSON const data = JSON.parse(cleanData); // 校验解析结果是否为数组 if (!Array.isArray(data)) { throw new Error('JSON文件内容不是预期的数组结构'); } // 遍历数组 for (let item of data) { // 可选:增加字段存在性校验,跳过异常项 if (!item.latjson || !item.lonjson || !item.IdOficina) { console.warn('当前项缺少必要字段,已跳过:', item); continue; } const url = `https://api.openweathermap.org/data/2.5/onecall?lat=${item.latjson}&lon=${item.lonjson}&exclude=hourly,daily&appid=123`; console.log(`Official Id: ${item.IdOficina}`); console.log(url); console.log('-----------'); } } catch (err) { console.error('处理失败,错误信息:', err.message); } }
快速排查方法
如果运行后仍有问题,可以依次打印rawData(原始读取内容)、cleanData(清洗后内容)、data(解析后内容)三个变量的取值和类型,就能快速定位是读文件环节、JSON解析环节还是遍历逻辑环节出了问题。
内容的提问来源于stack exchange,提问作者Martín JF
相关产品推荐
相关产品推荐

