性能: 优化磁盘信息获取方式,改为异步执行

问题:
- /api/admin/storage-stats 使用 execSync 同步执行 df/wmic 命令
- 同步执行会阻塞事件循环,影响并发请求处理
- 磁盘信息获取可能需要几百毫秒,影响响应速度

优化内容:
1. 导入 util.promisify 将 exec 转换为异步函数
2. 将路由处理函数改为 async
3. 使用 execAsync 替代 execSync 执行 df 命令
4. 使用 execAsync 替代 execSync 执行 wmic 命令

优势:
- 不阻塞事件循环,提升并发性能
- 管理员查看存储统计时不影响其他用户操作
- 更符合 Node.js 最佳实践
This commit is contained in:
2025-11-11 15:24:39 +08:00
parent 60bc89ffea
commit 9eade3e3e6

View File

@@ -10,7 +10,9 @@ const path = require('path');
const fs = require('fs'); const fs = require('fs');
const { body, validationResult } = require('express-validator'); const { body, validationResult } = require('express-validator');
const archiver = require('archiver'); const archiver = require('archiver');
const { execSync } = require('child_process'); const { exec, execSync } = require('child_process');
const util = require('util');
const execAsync = util.promisify(exec);
const { db, UserDB, ShareDB, SettingsDB, PasswordResetDB } = require('./database'); const { db, UserDB, ShareDB, SettingsDB, PasswordResetDB } = require('./database');
const { generateToken, authMiddleware, adminMiddleware } = require('./auth'); const { generateToken, authMiddleware, adminMiddleware } = require('./auth');
@@ -1775,7 +1777,7 @@ app.post('/api/admin/settings', authMiddleware, adminMiddleware, (req, res) => {
}); });
// 获取服务器存储统计信息 // 获取服务器存储统计信息
app.get('/api/admin/storage-stats', authMiddleware, adminMiddleware, (req, res) => { app.get('/api/admin/storage-stats', authMiddleware, adminMiddleware, async (req, res) => {
try { try {
// 获取本地存储目录 // 获取本地存储目录
const localStorageDir = path.join(__dirname, 'local-storage'); const localStorageDir = path.join(__dirname, 'local-storage');
@@ -1787,7 +1789,7 @@ app.get('/api/admin/storage-stats', authMiddleware, adminMiddleware, (req, res)
try { try {
// 获取本地存储目录所在分区的磁盘信息 // 获取本地存储目录所在分区的磁盘信息
const dfOutput = execSync(`df -B 1 / | tail -1`, { encoding: 'utf8' }); const { stdout: dfOutput } = await execAsync(`df -B 1 / | tail -1`, { encoding: 'utf8' });
const parts = dfOutput.trim().split(/\s+/); const parts = dfOutput.trim().split(/\s+/);
if (parts.length >= 4) { if (parts.length >= 4) {
@@ -1801,7 +1803,7 @@ app.get('/api/admin/storage-stats', authMiddleware, adminMiddleware, (req, res)
try { try {
// 获取本地存储目录所在的驱动器号 // 获取本地存储目录所在的驱动器号
const driveLetter = localStorageDir.charAt(0); const driveLetter = localStorageDir.charAt(0);
const wmicOutput = execSync(`wmic logicaldisk where "DeviceID='${driveLetter}:'" get Size,FreeSpace /value`, { encoding: 'utf8' }); const { stdout: wmicOutput } = await execAsync(`wmic logicaldisk where "DeviceID='' + driveLetter + '':''" get Size,FreeSpace /value`, { encoding: 'utf8' });
const freeMatch = wmicOutput.match(/FreeSpace=(\d+)/); const freeMatch = wmicOutput.match(/FreeSpace=(\d+)/);
const sizeMatch = wmicOutput.match(/Size=(\d+)/); const sizeMatch = wmicOutput.match(/Size=(\d+)/);