性能: 优化磁盘信息获取方式,改为异步执行
问题: - /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:
@@ -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+)/);
|
||||||
|
|||||||
Reference in New Issue
Block a user