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

Node.js将API汇率数据插入PostgreSQL的数据映射问题

问题核心原因
  • tcmbDovizKuru(cb) 调用位置错误,写在insertToDatabase函数内部会触发无限循环调用
  • data['tarihDate']['currency']是对象数组,直接将整个数组传给pg查询参数,和SQL语句里的7个占位符完全不匹配
  • 未提取数组内每个货币对象的对应字段,且currencyCode字段存储在子属性attributes下,直接读取会得到undefined
  • 数据库操作完成后未关闭连接,会造成连接泄漏
修复方案

方案1:逐条插入(适合数据量小的场景)

完整可运行代码如下:

var tcmbDovizKuru = require('tcmb-doviz-kuru');
var pg = require('pg');
// 替换为你自己的PostgreSQL连接串
const connectionString = 'postgresql://用户名:密码@数据库地址:端口/数据库名称';

function cb(error, data) {
    if (error) {
        return console.log('汇率接口请求失败', error)
    }
    insertToDatabase(data);
}

async function insertToDatabase(data){
    const pgClient = new pg.Client(connectionString);
    try {
        await pgClient.connect();
        const currencyList = data['tarihDate']['currency'];
        const insertSql = `INSERT INTO currency.kur("date", forexBuying, forexSelling, banknoteBuying, banknoteSelling, unit, isim, currencyCode)
            VALUES(CURRENT_TIMESTAMP,$1,$2,$3,$4,$5,$6,$7)`;
        
        // 遍历每条汇率数据依次插入
        for (let currency of currencyList) {
            // 严格按照SQL占位符顺序提取对应字段
            const params = [
                currency.forexBuying,
                currency.forexSelling,
                currency.banknoteBuying,
                currency.banknoteSelling,
                currency.unit,
                currency.isim,
                currency.attributes.currencyCode
            ];
            await pgClient.query(insertSql, params);
            console.log(`${currency.attributes.currencyCode} 汇率插入成功`);
        }
    } catch (e) {
        console.error('数据插入失败:', e);
    } finally {
        // 操作完成后关闭数据库连接
        await pgClient.end();
    }
}

// 接口调用放在全局位置,不要放在insertToDatabase内部
tcmbDovizKuru(cb);

方案2:批量插入(适合数据量大的场景,性能更高)

仅需要修改insertToDatabase函数即可,一次性提交所有插入请求,减少数据库IO开销:

async function insertToDatabase(data){
    const pgClient = new pg.Client(connectionString);
    try {
        await pgClient.connect();
        const currencyList = data['tarihDate']['currency'];
        const values = [];
        const placeholders = [];

        // 批量生成占位符和参数数组
        currencyList.forEach((currency, idx) => {
            const offset = idx * 7;
            placeholders.push(`(CURRENT_TIMESTAMP,$${offset+1},$${offset+2},$${offset+3},$${offset+4},$${offset+5},$${offset+6},$${offset+7})`);
            values.push(
                currency.forexBuying,
                currency.forexSelling,
                currency.banknoteBuying,
                currency.banknoteSelling,
                currency.unit,
                currency.isim,
                currency.attributes.currencyCode
            );
        });

        const insertSql = `INSERT INTO currency.kur("date", forexBuying, forexSelling, banknoteBuying, banknoteSelling, unit, isim, currencyCode)
            VALUES ${placeholders.join(',')}`;
        await pgClient.query(insertSql, values);
        console.log(`共${currencyList.length}条汇率数据插入成功`);
    } catch (e) {
        console.error('数据插入失败:', e);
    } finally {
        await pgClient.end();
    }
}

内容的提问来源于stack exchange,提问作者msanli224

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:00:04