You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:18:15