2 Commits

Author SHA1 Message Date
winter.liang c58565af77 fix: increase DB pool size and fix connection leak in permissions route
- connectionLimit 10 -> 50, queueLimit 0 -> 100 to prevent pool exhaustion
- Add missing db.release() in GET /permissions/:id finally block
2026-04-24 14:20:39 +08:00
Edison 66d29fa4b6 change to request format on the txt 2026-03-26 16:54:17 +08:00
3 changed files with 50 additions and 33 deletions
+26 -31
View File
@@ -72,11 +72,7 @@ export default function () {
}
// --- bool helper (handles BIT(1) returning Buffer) ---
const toBool = (v) =>
typeof v === 'number'
? v === 1
: Buffer.isBuffer(v)
? v[0] === 1
: Boolean(v)
typeof v === 'number' ? v === 1 : Buffer.isBuffer(v) ? v[0] === 1 : Boolean(v)
// ---- Lunch / totals helpers ----
const minutesBetween = (a, b) => Math.max(0, (b - a) / 60000)
@@ -232,12 +228,10 @@ export default function () {
res.json(rows)
} catch (error) {
console.error('Failed records summary error:', error)
res
.status(500)
.json({
message: 'Database error fetching failed records summary.',
details: error.message,
})
res.status(500).json({
message: 'Database error fetching failed records summary.',
details: error.message,
})
} finally {
db.release()
}
@@ -268,12 +262,10 @@ export default function () {
res.json(rows)
} catch (error) {
console.error('Failed records details error:', error)
res
.status(500)
.json({
message: 'Database error fetching failed records details.',
details: error.message,
})
res.status(500).json({
message: 'Database error fetching failed records details.',
details: error.message,
})
} finally {
db.release()
}
@@ -541,7 +533,7 @@ export default function () {
second: '2-digit',
hour12: false,
}).format(e.time)
const line = `${w.username},"${code}","${date} ${timeStr}";"${w.full_name}"`
const line = `${w.username};${code};${date};${timeStr};${w.full_name}`
if (!seen.has(line)) {
seen.add(line)
lines.push(line)
@@ -550,7 +542,8 @@ export default function () {
}
}
res.set('X-Export-TZ', TZ)
res.header('Content-Type', 'text/plain')
res
.header('Content-Type', 'text/plain')
.attachment(`attendance_${startDate}_to_${endDate}.txt`)
.send(lines.join('\n'))
return
@@ -833,6 +826,8 @@ export default function () {
res
.status(500)
.json({ message: 'Database error fetching manager permissions.', details: error.message })
} finally {
db.release()
}
})
@@ -1328,12 +1323,10 @@ export default function () {
res.status(200).json({ message: 'Device registration cleared and/or status updated.' })
} catch (error) {
console.error('Reset device/update status error:', error)
res
.status(500)
.json({
message: 'Database error resetting device or updating status.',
details: error.message,
})
res.status(500).json({
message: 'Database error resetting device or updating status.',
details: error.message,
})
} finally {
db.release()
}
@@ -1532,11 +1525,11 @@ export default function () {
const db = await getConnection()
try {
const [rows] = await db.execute(`
SELECT DISTINCT department
FROM workers
WHERE role = 'worker'
AND status != 'deleted'
AND department IS NOT NULL
SELECT DISTINCT department
FROM workers
WHERE role = 'worker'
AND status != 'deleted'
AND department IS NOT NULL
AND department != ''
ORDER BY department ASC
`)
@@ -1544,7 +1537,9 @@ export default function () {
res.json(departments)
} catch (error) {
console.error('Get departments error:', error)
res.status(500).json({ message: 'Database error fetching departments.', details: error.message })
res
.status(500)
.json({ message: 'Database error fetching departments.', details: error.message })
} finally {
db.release()
}
+2 -2
View File
@@ -13,8 +13,8 @@ const db = mysql.createPool({
database: process.env.DB_NAME,
port: process.env.DB_PORT,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
connectionLimit: 50,
queueLimit: 100,
// timezone: '+08:00',
dateStrings: true,
});
+22
View File
@@ -0,0 +1,22 @@
import { getConnection } from './pool.js'
// import mysql from 'mysql2/promise'
//
//
//
// export const db = mysql.createPool({
// host: '47.254.195.2',
// user: 'nilai_clock_indo',
// password: '5jHy8ZsfeEjPAhYS',
// database: 'nilai_clock_indo',
// port: 3306,
// waitForConnections: true,
// connectionLimit: 10,
// queueLimit: 0,
// dateStrings: true,
// // 不在这里设置timezone,因为我们用查询设置
// });
const conn = await getConnection()
const [rows] = await conn.execute('select * from clock_records where id= 6654');
console.log(rows);