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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:37:13