Files
PromdataPanel/server/db.js
2026-04-10 14:40:24 +08:00

71 lines
1.5 KiB
JavaScript

const mysql = require('mysql2/promise');
let pool;
const IS_SERVERLESS = [
process.env.SERVERLESS,
process.env.VERCEL,
process.env.AWS_LAMBDA_FUNCTION_NAME,
process.env.NETLIFY,
process.env.FUNCTION_TARGET,
process.env.K_SERVICE
].some(Boolean);
function getConnectionLimit() {
const parsed = parseInt(process.env.MYSQL_CONNECTION_LIMIT, 10);
if (!Number.isNaN(parsed) && parsed > 0) {
return parsed;
}
return IS_SERVERLESS ? 2 : 10;
}
function createPool() {
return mysql.createPool({
host: process.env.MYSQL_HOST || 'localhost',
port: parseInt(process.env.MYSQL_PORT, 10) || 3306,
user: process.env.MYSQL_USER || 'root',
password: process.env.MYSQL_PASSWORD || '',
database: process.env.MYSQL_DATABASE || 'display_wall',
waitForConnections: true,
connectionLimit: getConnectionLimit(),
queueLimit: 0,
enableKeepAlive: true,
keepAliveInitialDelay: 0
});
}
function getPool() {
if (!pool) {
pool = createPool();
}
return pool;
}
function initPool({ force = false } = {}) {
if (pool && !force) {
return pool;
}
if (pool) {
pool.end().catch(e => console.error('Error closing pool:', e));
}
pool = createPool();
return pool;
}
async function checkHealth() {
try {
await getPool().query('SELECT 1');
return { status: 'up' };
} catch (err) {
return { status: 'down', error: err.message };
}
}
module.exports = {
query: (...args) => getPool().query(...args),
getPool,
initPool,
checkHealth
};