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 { // 不关闭连接池,保持连接池打开以提高性能 // 如果需要关闭连接池,应该在关闭后将 pool 变量设置为 null // if (pool) { // await pool.end(); // pool = null; // } } }