
本文详解如何在 Node.js 中安全、精准地批量更新多个 JSON 文件中特定路径的字段(如 token、id、session.session_id),避免误改嵌套同名键,并修复常见 SyntaxError: Unexpected token o 等典型错误。
本文详解如何在 node.js 中安全、精准地批量更新多个 json 文件中特定路径的字段(如 `token`、`id`、`session.session_id`),避免误改嵌套同名键,并修复常见 `syntaxerror: unexpected token o` 等典型错误。
在构建 Mock API 或本地开发环境时,常需动态更新一组 JSON 配置文件中的关键凭证字段(如认证 token、会话 ID)。但直接遍历修改易引发两类问题:一是路径不明确导致误改(例如 session.json 中 resident.id 不应被覆盖);二是同步 I/O 与 JSON 序列化不当引发运行时错误(如 TypeError: fs.fileWrite is not a function 或 SyntaxError: Unexpected token o in JSON at position 1)。以下提供健壮、可复用的解决方案。
✅ 正确实现:路径精准 + 错误防护 + 同步写入
Node.js 原生 fs 模块无 fs.fileWrite 方法——正确方法是 fs.writeFileSync(),且必须将对象序列化为字符串后再写入,否则会写入 [object Object] 导致后续解析失败(即报错 Unexpected token o)。同时,建议统一路径前缀、添加异常捕获,并支持灵活字段映射:
const fs = require('fs');
const path = require('path');
// 定义待更新文件及其目标字段路径(支持嵌套,如 'session.session_id')
const FILES_TO_UPDATE = [
{ file: 'json/standardsession.json', fields: { token: null } },
{ file: 'json/session.json', fields: { token: null, id: null } },
{ file: 'json/start.json', fields: { 'session.session_id': null } }
];
function updateJsonFiles(newValue) {
try {
FILES_TO_UPDATE.forEach(({ file, fields }) => {
const fullPath = path.resolve(__dirname, file);
const rawData = fs.readFileSync(fullPath, 'utf8');
let obj = JSON.parse(rawData);
// 按字段路径逐个赋值(支持嵌套)
Object.keys(fields).forEach(keyPath => {
const keys = keyPath.split('.');
let target = obj;
for (let i = 0; i < keys.length - 1; i++) {
if (target[keys[i]] === undefined || typeof target[keys[i]] !== 'object') {
throw new Error(`Invalid path '${keyPath}' in ${file}: missing intermediate key '${keys[i]}'`);
}
target = target[keys[i]];
}
target[keys[keys.length - 1]] = newValue;
});
// ✅ 关键:序列化后写入,避免 [object Object]
fs.writeFileSync(fullPath, JSON.stringify(obj, null, 2), 'utf8');
console.log(`✓ Updated ${file} with value: "${newValue}"`);
});
} catch (err) {
console.error('❌ Update failed:', err.message);
throw err;
}
}
// 使用示例
updateJsonFiles('a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8');⚠️ 注意事项与最佳实践
- 路径安全:使用 path.resolve(__dirname, ...) 确保路径相对于当前脚本,避免因工作目录不同导致 ENOENT 错误。
- 嵌套字段处理:通过 keyPath.split('.') 动态遍历对象,精准定位 session.session_id,而不会影响 resident.id。
- JSON 格式化:JSON.stringify(obj, null, 2) 保持缩进,便于人工校验;生产环境可省略缩进提升性能。
- 错误防御:检查中间键是否存在,防止 Cannot set property 'session_id' of undefined。
- 原子性考虑:当前为同步顺序更新;若需全量成功或失败,可先读取全部文件、验证后再批量写入,或引入临时备份机制。
? 扩展:简易 Web 表单(Express 示例)
若需交互式输入,可快速搭建轻量 HTTP 接口:
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post('/api/update-token', (req, res) => {
const { token } = req.body;
if (!token || typeof token !== 'string') {
return res.status(400).json({ error: 'Missing or invalid "token" field' });
}
try {
updateJsonFiles(token);
res.json({ success: true, message: `Token updated across ${FILES_TO_UPDATE.length} files.` });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.listen(3000, () => console.log('Mock API updater running on http://localhost:3000'));访问 http://localhost:3000 提交表单即可触发更新,兼顾开发效率与工程严谨性。
总结:批量更新 JSON 的核心在于「路径精确性」与「序列化安全性」。拒绝硬编码重复逻辑,用配置驱动更新规则;杜绝 fs.writeFile 直接传对象,始终 JSON.stringify();结合路径解析与错误校验,即可构建稳定可靠的本地 Mock 数据管理能力。










