iboard/pages/api/exchange-rate.js
2026-04-25 19:22:57 +08:00

106 lines
2.7 KiB
JavaScript

import { createPool } from 'mariadb';
import fs from 'fs';
import path from 'path';
function loadDatabaseConfig() {
const envPath = path.join(process.cwd(), '.env');
if (fs.existsSync(envPath)) {
const envContent = fs.readFileSync(envPath, 'utf-8');
const lines = envContent.split('\n');
for (const line of lines) {
const trimmedLine = line.trim();
if (trimmedLine.startsWith('DATABASE_URL=')) {
const url = trimmedLine.substring('DATABASE_URL='.length).replace(/^"|"$/g, '');
// 解析URL
const parts = url.split('://')[1].split('@');
const auth = parts[0].split(':');
const hostAndDb = parts[1].split('/');
const hostAndPort = hostAndDb[0].split(':');
return {
user: auth[0],
password: auth[1],
host: hostAndPort[0],
port: parseInt(hostAndPort[1]),
database: hostAndDb[1]
};
}
}
}
return {
host: '192.168.111.111',
port: 3306,
user: 'root',
password: 'fullstack',
database: 'iboard'
};
}
let pool;
async function initPool() {
if (!pool) {
const config = loadDatabaseConfig();
pool = createPool({
host: config.host,
port: config.port,
user: config.user,
password: config.password,
database: config.database,
connectionLimit: 5
});
}
return pool;
}
export default async function handler(req, res) {
try {
await initPool();
// 获取查询参数
const { startDate, endDate, limit = 30 } = req.query;
let query = 'SELECT date, centerPrice FROM econ_ExchangeRate WHERE currency = ? ORDER BY date DESC';
const params = ['USD/CNY'];
if (startDate && endDate) {
query = 'SELECT date, centerPrice FROM econ_ExchangeRate WHERE currency = ? AND date BETWEEN ? AND ? ORDER BY date DESC';
params.push(startDate, endDate);
}
const result = await pool.query(query, params);
// 限制返回数量
const limitedResult = result.slice(0, parseInt(limit));
// 反转顺序,使日期从早到晚
const sortedResult = limitedResult.reverse();
// 格式化数据
const formattedData = sortedResult.map(row => ({
date: row.date instanceof Date ? row.date.toISOString().split('T')[0] : row.date,
rate: parseFloat(row.centerPrice)
}));
res.status(200).json({
success: true,
data: formattedData,
total: result.length
});
} catch (error) {
console.error('获取汇率数据失败:', error.message);
res.status(500).json({
success: false,
message: '获取汇率数据失败',
error: error.message
});
} finally {
if (pool) {
await pool.end();
}
}
}