Node.js实现新增文件文件名自动存入数据库的问题求助
实现目录新增文件监测并写入MySQL数据库
嘿,我看你已经搭好了MySQL连接的基础框架,接下来咱们把目录文件监听的核心功能补上,帮你完整实现需求。
首先,Node.js原生的fs模块就提供了文件监听能力,先给你补全完整的代码,再聊聊优化点:
完整实现代码(原生fs版本)
const path = require('path'); const fs = require('fs'); var mysql = require('mysql'); // MySQL连接配置 var con = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "sms" }); // 连接数据库 con.connect(function(err) { if (err) { console.error('数据库连接失败:', err); return; } console.log('数据库连接成功'); // 启动目录监听 startWatchingDirectory('./your-watch-directory'); // 替换成你要监听的目录路径 }); // 封装插入文件名到数据库的函数 function insertFileNameToDB(filename) { // 可选:避免重复插入,先查询是否已存在 const checkQuery = 'SELECT * FROM your_table_name WHERE filename = ?'; // 替换成你的表名 con.query(checkQuery, [filename], (err, results) => { if (err) { console.error('查询数据库失败:', err); return; } if (results.length === 0) { const insertQuery = 'INSERT INTO your_table_name (filename) VALUES (?)'; con.query(insertQuery, [filename], (err, result) => { if (err) { console.error('插入数据失败:', err); return; } console.log(`成功插入文件名: ${filename}`); }); } else { console.log(`文件名 ${filename} 已存在于数据库中`); } }); } // 启动目录监听的函数 function startWatchingDirectory(watchPath) { // 解析绝对路径,避免相对路径问题 const absolutePath = path.resolve(watchPath); // 监听目录变化 fs.watch(absolutePath, { recursive: false }, (eventType, filename) => { // 不同系统的事件类型有差异,macOS是'rename',Windows可能是'change' if (filename && (eventType === 'rename' || eventType === 'change')) { // 确认是文件而非目录 fs.stat(path.join(absolutePath, filename), (err, stats) => { if (err) { console.error('获取文件信息失败:', err); return; } if (stats.isFile()) { insertFileNameToDB(filename); } }); } }); console.log(`开始监听目录: ${absolutePath}`); } // 程序退出时关闭数据库连接 process.on('exit', () => { con.end(); console.log('数据库连接已关闭'); });
关键注意点说明
- 替换占位内容:记得把
./your-watch-directory换成你实际要监听的目录,your_table_name换成存储文件名的数据库表名(建议提前创建表,比如表结构:CREATE TABLE file_records (id INT AUTO_INCREMENT PRIMARY KEY, filename VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);)。 - 原生fs.watch的局限性:跨平台事件触发逻辑不一致,还可能出现重复触发的情况。如果追求生产环境稳定性,推荐用第三方库
chokidar。
更稳定的实现(使用chokidar库)
先安装依赖:
npm install chokidar
然后替换监听部分的代码:
const chokidar = require('chokidar'); // 替换startWatchingDirectory函数 function startWatchingDirectory(watchPath) { const absolutePath = path.resolve(watchPath); // 初始化chokidar监听 const watcher = chokidar.watch(absolutePath, { ignored: /^\./, // 忽略隐藏文件 persistent: true, ignoreInitial: true // 只监听新增文件,忽略目录原有文件 }); // 监听文件新增事件 watcher.on('add', (filePath) => { const filename = path.basename(filePath); insertFileNameToDB(filename); }); // 监听错误 watcher.on('error', (error) => console.error('监听出错:', error)); console.log(`开始监听目录: ${absolutePath}`); }
chokidar处理了跨平台兼容性问题,事件触发更可靠,还支持过滤隐藏文件、忽略初始文件等实用功能,生产环境更推荐。
额外优化建议
- 使用连接池:如果需要处理大量文件插入,建议用
mysql.createPool()代替单连接,避免连接耗尽。 - 内存去重:可以在内存中维护一个已处理文件名的集合,减少数据库查询次数。
- 日志记录:把错误和操作日志写入文件,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Riyota Miyagi
相关产品推荐
相关产品推荐

