常见原因是未指定UTF-8编码导致返回Buffer或乱码,且JSON文件含BOM或格式错误时JSON.parse会抛错,须用try/catch处理并校验空内容。

为什么 fs.readFile 读出来的 JSON 是 undefined 或乱码
常见原因是没正确处理异步回调或编码格式。Node 的 fs.readFile 默认以 buffer 形式返回,直接 console.log 看不到结构;若没指定 utf8 编码,转字符串会出错或显示乱码。
- 必须传入
{ encoding: 'utf8' }选项,否则返回的是Buffer,需手动.toString() - 用
async/await时,函数必须声明为async,且调用处要用await,否则readFile返回 Promise 对象而非数据 - JSON 文件开头有 BOM(比如 Windows 记事本保存的)会导致
JSON.parse()报SyntaxError: Unexpected token \ufeff,建议用 VSCode 以 UTF-8 无 BOM 格式保存文件
如何安全地 parse 读到的 JSON 字符串
JSON.parse() 很脆弱,原始内容只要多一个逗号、少一个引号,就直接抛异常并中断流程。生产级代码不能裸写 JSON.parse(data)。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 用
try/catch包裹,捕获SyntaxError并给出具体文件名和错误位置提示 - 检查
data是否为空字符串或只有空白符,避免JSON.parse('')报错 - 如果 JSON 内容来自用户输入或外部文件,建议先用正则粗筛(如
/^\s*{[\s\S]*}\s*$/.test(data)),再 parse,减少异常开销
try {
const data = await fs.readFile('./config.json', 'utf8');
if (!data.trim()) throw new Error('Empty file');
const obj = JSON.parse(data);
return obj;
} catch (err) {
if (err instanceof SyntaxError) {
console.error(`Invalid JSON in config.json: ${err.message}`);
}
throw err;
}
写 JSON 到文件时换行缩进 vs 压缩格式怎么选
JSON.stringify() 的第三个参数控制格式化。VSCode 中调试或人工维护用缩进,CI/部署或体积敏感场景用压缩。
- 开发时用
JSON.stringify(obj, null, 2):可读性强,Git diff 清晰,VSCode 自带 JSON 验证会实时标红语法错误 - 上线前写入配置或生成构建产物,用
JSON.stringify(obj)(无空格):减少文件体积,避免因缩进引发的意外空白差异 - 注意:
JSON.stringify()会忽略undefined、函数、Symbol 类型字段,如果对象含这些值,要提前过滤或用自定义 replacer
在 VSCode 终端里运行脚本却提示“Cannot find module ‘fs’”
这不是 Node 环境问题,而是 VSCode 终端没激活正确的 Node 版本,或者你在 TypeScript 文件里没配好类型声明。
- 确认终端执行的是 Node 而非其他 shell:运行
which node(macOS/Linux)或where node(Windows),确保路径指向你安装的 Node - 如果是 TS 文件,需安装
@types/node:运行npm install --save-dev @types/node,否则 VSCode 会标红fs相关 API - VSCode 的 JavaScript/TypeScript 语言服务有时缓存旧类型,重启 TS Server(Ctrl+Shift+P → “Restart TS server”)可解决误报
__dirname 和 path.join() 才靠谱;错误处理别只打日志,该 throw 就 throw,让上层决定是否静默失败。

















