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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:38:36