Node.js脚本调用jsonrepair捕获23次错误后冻结问题求助
解决jsonrepair脚本捕获23次错误后冻结的问题
使用jsonrepair模块修复JSON时,脚本在捕获23次错误后会卡在catch块中无响应。尝试将变量置为null无法解决,且该问题仅在特定机器(生产环境)出现,与生产配置相似的测试环境无此冻结现象。相关代码如下:
const { Client } = require('pg'); const { jsonrepair } = require('jsonrepair') // Database connection settings const dbSettings = { user: 'postgres', password: pw, host: 'localhost', database: 'db', port: 5432, }; // Create a new PostgreSQL client const client = new Client(dbSettings); async function main() { try { await client.connect(); // Fetch rows with broken JSON from the database const query = "SELECT jsonresponse FROM brokenjson"; const result = await client.query(query); const rows = result.rows; // Iterate through rows, repair JSON, and update data for (const row of rows) { const { obit_sqn, response } = row; try { const repairedJSON = jsonrepair(response); // Parse the repaired JSON console.log(repairedJSON); console.log(`${obit_sqn}`); } catch (error) { console.log(`Error: ${error.message}`); } } } catch (error) { } finally { await client.end(); } } main();
可行的解决思路:
给修复操作加超时限制
部分损坏严重的JSON可能导致jsonrepair陷入死循环或长时间阻塞。用Promise.race给单条数据的修复流程加超时,避免卡住整个脚本:// 封装带超时的jsonrepair async function repairWithTimeout(jsonStr, timeout = 5000) { return Promise.race([ new Promise(resolve => resolve(jsonrepair(jsonStr))), new Promise((_, reject) => setTimeout(() => reject(new Error('修复超时')), timeout)) ]); } // 循环中替换原修复逻辑 try { const repairedJSON = await repairWithTimeout(response); console.log(repairedJSON); console.log(`${obit_sqn}`); } catch (error) { console.log(`[${obit_sqn}] Error: ${error.message}`); }定期触发垃圾回收
生产环境可能因内存碎片累积导致异常,启动Node.js时添加--expose-gc参数开启手动GC权限,然后在循环中定期清理:// 每处理10条数据触发一次GC let count = 0; for (const row of rows) { count++; // ... 原处理逻辑 ... if (count % 10 === 0 && global.gc) { global.gc(); console.log('已触发手动垃圾回收'); } }定位出错的具体数据
既然卡在第23次错误,先记录这条数据的详情,单独测试jsonrepair的处理情况:catch (error) { console.log(`[${obit_sqn}] Error: ${error.message}`); // 将出错的JSON写入文件,方便单独排查 require('fs').writeFileSync(`error_${obit_sqn}.json`, response); }拿到出错的JSON后,单独运行
jsonrepair测试,确认是否是数据导致的死循环。更换依赖版本或替代库
可能是当前jsonrepair版本存在特定场景的bug,尝试升级到最新版,或者换用jsonlint、fixjson等库测试修复效果。调整Node.js运行参数
生产环境可尝试调整内存限制或引擎优化参数,比如:node --max-old-space-size=4096 --no-force-async-hooks-checks your-script.js
内容的提问来源于stack exchange,提问作者dirtyw0lf
相关产品推荐
相关产品推荐

