API返回数据无法本地保存为JSON问题求助(附Node.js脚本)
问题分析与解决方案
核心问题
你的脚本存在几个关键问题导致数据保存未完成:
- 脚本未调用定义好的
fetchAndSavePools函数(你提供的代码末尾缺少fetchAndSavePools()执行语句),这是逻辑无法启动的直接原因; - 使用同步文件IO(
readFileSync/writeFileSync)处理大体积数据,会阻塞Node.js事件循环,导致脚本长时间无响应甚至卡住; - 直接对85k+数据量的数组执行
JSON.stringify同步序列化,内存占用高、处理耗时久,容易让脚本看起来“未完成”。
修改后的脚本
const axios = require('axios'); const fs = require('fs').promises; // 使用异步文件API const path = require('path'); const API_URL = 'https://api.raydium.io/v2/sdk/liquidity/mainnet.json'; const JSON_FILE_PATH = path.resolve('data/allPools.json'); console.log("Script is starting..."); async function fetchAndSavePools() { try { const response = await axios.get(API_URL); console.log("Fetched data from API."); if (!response.data?.unofficial || !Array.isArray(response.data.unofficial)) { console.log("API response does not contain 'unofficial' array or is not structured as expected."); console.log("API Response Structure:", Object.keys(response.data || {})); return; } const currentPools = response.data.unofficial; console.log(`Got ${currentPools.length} unofficial pool entries.`); let allPoolsData = []; // 异步检查文件是否存在并读取 try { const existingData = await fs.readFile(JSON_FILE_PATH, 'utf-8'); allPoolsData = JSON.parse(existingData); console.log(`Loaded ${allPoolsData.length} existing entries.`); } catch (readErr) { // 文件不存在或读取失败,初始化空数组 if (readErr.code === 'ENOENT') { console.log("No existing data file found, starting fresh."); } else { console.error("Failed to read existing data file:", readErr.message); } } // 可选:基于池子ID去重,避免重复写入 const poolIds = new Set(allPoolsData.map(p => p.id)); const newPools = currentPools.filter(p => !poolIds.has(p.id)); allPoolsData.push(...newPools); console.log(`Total entries to save: ${allPoolsData.length} (added ${newPools.length} new entries)`); // 异步写入文件,避免阻塞 await fs.writeFile(JSON_FILE_PATH, JSON.stringify(allPoolsData, null, 2)); console.log(`All pools data saved to '${JSON_FILE_PATH}'.`); } catch (error) { console.error("Error during fetch/save process:", error.message); if (error.response) { console.error("API Response Status:", error.response.status); } } } // 执行核心函数 fetchAndSavePools();
关键优化点
- 补充函数调用:末尾添加
fetchAndSavePools()确保逻辑正常启动; - 改用异步文件API:
fs.promises的异步方法不会阻塞事件循环,适合处理大体积数据; - 细化错误处理:单独处理文件读取的异常(比如文件不存在的场景),提供更清晰的执行日志;
- 新增进度日志:打印各阶段的数据量,方便跟踪脚本执行状态;
- 可选去重逻辑:基于池子唯一ID过滤重复数据,避免本地文件体积无意义膨胀。
内容的提问来源于stack exchange,提问作者Robbin
相关产品推荐
相关产品推荐

