Node.js无需重启服务监听fs目录变动同步最新文件列表到前端
问题根源
你现有代码的错误逻辑是:setInterval 反复执行 dataExchange() 只是重复注册完全相同的 /getData 接口,完全不会更新存储文件名的 currentData 数组,接口返回的永远是服务启动时第一次读取的旧数据。
方案1:定时轮询更新数据(实现简单,适合小项目)
不需要重复注册接口,只需要定时重新读取目录更新 currentData 的值即可,代码修改如下:
const fs = require("fs"); const path = require("path"); const TARGET_DIR = path.resolve(__dirname, "./dirPATH"); // 避免相对路径出错 let currentData = [] // 封装读取目录更新数据的方法 function updateFileList() { try { currentData = fs.readdirSync(TARGET_DIR); } catch (err) { console.error("读取目录失败:", err); } } // 初始化先读一次 updateFileList(); // 每2秒更新一次数据,不用动接口注册 setInterval(updateFileList, 2000); // 接口只需要注册一次就行 app.post("/getData", (req, res) => { try { res.send(currentData); } catch (error) { console.log(error); res.status(400).send(error.message); } })
方案2:监听目录变更触发更新(性能更高,变更实时性更好)
用Node.js原生的fs.watch方法直接监听目标目录,只有目录发生新增/删除/修改文件的操作时才触发更新,不用定时轮询浪费资源:
const fs = require("fs"); const path = require("path"); const TARGET_DIR = path.resolve(__dirname, "./dirPATH"); let currentData = [] function updateFileList() { try { currentData = fs.readdirSync(TARGET_DIR); } catch (err) { console.error("读取目录失败:", err); } } updateFileList(); // 监听目录变化,有变更就更新数据 fs.watch(TARGET_DIR, (eventType, filename) => { // eventType为rename对应文件新增/删除,change对应文件内容修改,按需过滤 if (eventType === 'rename') { updateFileList(); // 如果需要服务端主动推给前端,这里可以加WebSocket推送逻辑 } }); // 接口同样只注册一次 app.post("/getData", (req, res) => { try { res.send(currentData); } catch (error) { console.log(error); res.status(400).send(error.message); } })
额外说明
- 如果接口访问量很低,也可以选择不在本地缓存文件列表,每次收到
/getData请求时直接调用fs.readdirSync读取最新目录内容返回,完全不用做定时更新或者监听逻辑,实现更简单。 - 如果需要实现目录新增文件后无需前端发起请求就能自动同步到客户端,需要搭配WebSocket方案,在目录变更的回调里主动把最新的文件列表推给所有连接的前端客户端即可。
内容的提问来源于stack exchange,提问作者seriously
相关产品推荐
相关产品推荐

