From 9eade3e3e6676c20156188b4c2081be22fffd678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=BB=E5=8B=87=E7=A5=A5?= <237899745@qq.com> Date: Tue, 11 Nov 2025 15:24:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A7=E8=83=BD:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=A3=81=E7=9B=98=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=BC=82=E6=AD=A5=E6=89=A7?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - /api/admin/storage-stats 使用 execSync 同步执行 df/wmic 命令 - 同步执行会阻塞事件循环,影响并发请求处理 - 磁盘信息获取可能需要几百毫秒,影响响应速度 优化内容: 1. 导入 util.promisify 将 exec 转换为异步函数 2. 将路由处理函数改为 async 3. 使用 execAsync 替代 execSync 执行 df 命令 4. 使用 execAsync 替代 execSync 执行 wmic 命令 优势: - 不阻塞事件循环,提升并发性能 - 管理员查看存储统计时不影响其他用户操作 - 更符合 Node.js 最佳实践 --- backend/server.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/backend/server.js b/backend/server.js index c5865cf..4ef0d64 100644 --- a/backend/server.js +++ b/backend/server.js @@ -10,7 +10,9 @@ const path = require('path'); const fs = require('fs'); const { body, validationResult } = require('express-validator'); 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 { 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 { // 获取本地存储目录 const localStorageDir = path.join(__dirname, 'local-storage'); @@ -1787,7 +1789,7 @@ app.get('/api/admin/storage-stats', authMiddleware, adminMiddleware, (req, res) 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+/); if (parts.length >= 4) { @@ -1801,7 +1803,7 @@ app.get('/api/admin/storage-stats', authMiddleware, adminMiddleware, (req, res) try { // 获取本地存储目录所在的驱动器号 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 sizeMatch = wmicOutput.match(/Size=(\d+)/);