實作前台 APP 呈現、APP 詳細頁面

This commit is contained in:
2025-09-10 00:27:26 +08:00
parent 900e33aefa
commit bc2104d374
17 changed files with 318 additions and 1565 deletions

View File

@@ -18,6 +18,14 @@ const dbConfig = {
reconnect: true,
connectionLimit: 10,
queueLimit: 0,
// 添加連接重試和錯誤處理配置
retryDelay: 2000,
maxRetries: 3,
// 添加連接池配置
idleTimeout: 300000,
maxIdle: 10,
// 添加 SSL 配置(如果需要)
ssl: false,
};
// 創建連接池
@@ -46,19 +54,51 @@ export class Database {
// 執行查詢
public async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
const connection = await this.getConnection();
try {
const [rows] = await connection.execute(sql, params);
return rows as T[];
} finally {
connection.release();
let connection;
let retries = 0;
const maxRetries = 3;
while (retries < maxRetries) {
try {
connection = await this.getConnection();
const [rows] = await connection.execute(sql, params);
return rows as T[];
} catch (error: any) {
console.error(`資料庫查詢錯誤 (嘗試 ${retries + 1}/${maxRetries}):`, error.message);
if (connection) {
connection.release();
}
if (error.code === 'ECONNRESET' || error.code === 'PROTOCOL_CONNECTION_LOST') {
retries++;
if (retries < maxRetries) {
console.log(`等待 ${2000 * retries}ms 後重試...`);
await new Promise(resolve => setTimeout(resolve, 2000 * retries));
continue;
}
}
throw error;
} finally {
if (connection) {
connection.release();
}
}
}
throw new Error('資料庫連接失敗,已達到最大重試次數');
}
// 執行單一查詢
public async queryOne<T = any>(sql: string, params?: any[]): Promise<T | null> {
const results = await this.query<T>(sql, params);
return results.length > 0 ? results[0] : null;
try {
const results = await this.query<T>(sql, params);
return results.length > 0 ? results[0] : null;
} catch (error) {
console.error('資料庫單一查詢錯誤:', error);
throw error;
}
}
// 執行插入