106 lines
2.7 KiB
JavaScript
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();
|
|
}
|
|
}
|
|
}
|