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);
关键说明
- 依赖安装:先在项目目录执行
npm install mysql2安装数据库驱动 - 路径处理:用
path模块拼接路径,避免Windows/Linux路径分隔符问题 - SQL写法:占位符
?不要加引号,驱动会自动把Buffer转为数据库BLOB类型 - 多表适配:只需修改
tablesToUpdate数组,添加需要更新的表名即可 - 错误处理:每个步骤都加了异常捕获,方便排查问题
内容的提问来源于stack exchange,提问作者Alone Wasser
相关产品推荐
相关产品推荐

