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

Node.js fs.readFileSync报错及多表BLOB写入功能复现求助

问题解决与多表适配方案

先解决当前报错

报错TypeError: Cannot read properties of undefined (reading 'readFileSync')是因为没有导入Node.js的fs文件系统模块,直接调用fs.readFileSync会找不到fs对象。

完整可运行代码(适配多数据表)

以下是重构后的代码,解决了原代码的语法错误、SQL问题,同时支持批量处理图片并写入多个数据表,注释清晰适合零基础理解:

// 1. 导入必要的模块
const fs = require('fs');
const path = require('path');
const mysql = require('mysql2/promise');

// 2. 配置数据库连接(根据自己的数据库信息修改)
const pool = mysql.createPool({
  host: 'localhost',
  user: '你的数据库用户名',
  password: '你的数据库密码',
  database: '你的数据库名',
  connectionLimit: 10
});

// 3. 读取图片文件转为Buffer(对应数据库BLOB类型)
async function readImage(filePath) {
  try {
    // 异步读取文件,避免阻塞程序
    return await fs.promises.readFile(filePath);
  } catch (err) {
    console.error(`读取图片失败:${filePath}`, err);
    throw err;
  }
}

// 4. 通用更新函数:支持指定数据表
async function updateImageToTable(tableName, imageBuffer, imageName) {
  try {
    // SQL占位符?不需要加引号,驱动会自动处理类型转换
    const sql = `UPDATE ${tableName} SET access = ? WHERE Image = ?`;
    // 执行SQL,传入参数数组
    const [result] = await pool.execute(sql, [imageBuffer, imageName]);
    console.log(`表【${tableName}】中,图片${imageName}更新完成,影响行数:${result.affectedRows}`);
  } catch (err) {
    console.error(`更新表【${tableName}】失败`, err);
    throw err;
  }
}

// 5. 主流程:遍历目录+批量更新多表
async function processAllImages(imageDir, targetTables) {
  try {
    // 获取目录下所有文件
    const files = await fs.promises.readdir(imageDir);

    for (const fileName of files) {
      // 拼接完整文件路径
      const fullPath = path.join(imageDir, fileName);
      // 跳过子目录,只处理文件
      const fileStats = await fs.promises.stat(fullPath);
      if (!fileStats.isFile()) continue;

      // 过滤图片文件(可根据需要添加/修改后缀)
      const validExts = ['.jpg', '.jpeg', '.png', '.gif'];
      const fileExt = path.extname(fileName).toLowerCase();
      if (!validExts.includes(fileExt)) continue;

      // 获取图片名称(去掉后缀)
      const imageName = path.basename(fileName, fileExt);
      // 读取图片Buffer
      const imageBuffer = await readImage(fullPath);

      // 循环更新到每个指定的数据表
      for (const table of targetTables) {
        await updateImageToTable(table, imageBuffer, imageName);
      }
    }

    console.log('所有图片处理完成!');
  } catch (err) {
    console.error('整体处理出错', err);
  } finally {
    // 处理完成后关闭数据库连接池
    await pool.end();
  }
}

// 6. 启动程序:指定图片目录和要更新的表名数组
const imageDirectory = __dirname; // 当前脚本所在目录,可改为你的图片文件夹路径
const tablesToUpdate = ['cloth', 'shoes', 'bags']; // 替换成你需要的所有数据表名
processAllImages(imageDirectory, tablesToUpdate);

关键说明

  1. 依赖安装:先在项目目录执行npm install mysql2安装数据库驱动
  2. 路径处理:用path模块拼接路径,避免Windows/Linux路径分隔符问题
  3. SQL写法:占位符?不要加引号,驱动会自动把Buffer转为数据库BLOB类型
  4. 多表适配:只需修改tablesToUpdate数组,添加需要更新的表名即可
  5. 错误处理:每个步骤都加了异常捕获,方便排查问题

内容的提问来源于stack exchange,提问作者Alone Wasser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:25:31