Node.js fs 文件系统模块 四种读写方案全解析

📅 2026/7/11 2:03:12
Node.js fs 文件系统模块 四种读写方案全解析
fs是 Node 内置文件系统模块用于读写文件、操作文件夹。JS 是单线程语言fs 提供同步阻塞、回调异步、Promise、async/await 四种写法一步步解决异步嵌套带来的回调地狱问题。一、模块导入两种方式基础 fs提供同步 API、回调风格异步 APIjs运行import fs from fs;fs/promises专门提供 Promise 风格 API适配 async/await推荐生产使用js运行import fs from fs/promises;二、方案 1同步读取 readFileSync阻塞主线程特点代码顺序执行文件读取期间阻塞整个线程不适合接口、循环大量 IO仅适合项目启动一次性读取配置文件。js运行import fs from fs; const syncData fs.readFileSync(./test.txt, utf-8); console.log(syncData);缺点并发场景大量文件读写会严重降低服务性能。三、方案 2回调异步 readFileES6 原生写法回调地狱Node 统一错误优先回调规范(err, data) {}读取成功err nulldata 为文件内容读取失败err 为错误对象文件不存在、权限不足等串行读取多个文件时会产生多层嵌套即回调地狱维护成本极高。js运行import fs from fs; fs.readFile(./file1.txt, utf-8, (err, data) { if (!err) { console.log(file1, data); } else { console.log(err); } fs.readFile(./file2.txt, utf-8, (err, data) { if (!err) { console.log(file2, data); } else { console.log(err); } fs.readFile(./file3.txt, utf-8, (err, data) { if (!err) { console.log(file3, data); } else { console.log(err); } }) }) })四、方案 3Promise 链式调用消除嵌套基于fs/promisesreadFile 返回 Promise使用.then()链式串行执行解决多层嵌套问题缺点是多文件场景重复书写 then代码冗余。js运行import fs from fs/promises; fs.readFile(./file1.txt, utf-8) .then(data { console.log(file1, data); return fs.readFile(./file2.txt, utf-8); }) .then(data { console.log(file2, data); return fs.readFile(./file3.txt, utf-8); }) .then(data { console.log(file3, data); })五、方案 4async/awaitES8 最优方案生产首选async/await 是 Promise 的语法糖底层依旧异步、不会阻塞主线程代码线性自上而下书写可读性最强。限制await 只能写在 async 函数内顶层直接 await 会报错使用 IIFE 立即执行函数包裹。补充Promise、await 属于微任务setTimeout 属于宏任务。js运行import fs from fs/promises; (async () { const file1Data await fs.readFile(./file1.txt, utf-8); console.log(file1, file1Data); const file2Data await fs.readFile(./file2.txt, utf-8); console.log(file2, file2Data); const file3Data await fs.readFile(./file3.txt, utf-8); console.log(file3, file3Data); })();完整健壮写法增加 try/catch 捕获读取错误js运行import fs from fs/promises; (async () { try { const data await fs.readFile(./test.txt, utf-8); console.log(data); } catch (err) { console.error(文件读取失败, err); } })();六、异步代码演进路线同步阻塞性能差→ 回调函数回调地狱→ Promise then 链式冗余→ async/await简洁易维护七、四种读取方式对比表表格写法是否阻塞线程优点缺点readFileSync阻塞写法极简大量 IO 严重影响服务性能readFile 回调非阻塞无需额外导入串行多文件产生回调地狱Promise then非阻塞无嵌套结构多文件链式代码重复繁琐async await非阻塞线性阅读代码整洁ES8 语法需 async 函数包裹八、工程开发最佳实践业务文件读写统一使用fs/promises async/await所有文件读取必须搭配 try/catch 捕获异常同步 readFileSync 仅用于项目初始化加载配置接口业务禁止使用路径搭配 path.resolve 生成绝对路径防止运行目录变更导致文件找不到。