Node.js 中 fs 模块异步读写应优先使用 fs.promises(Node.js 10+),统一风格、显式错误处理、注意编码与数据类型、避免大文件内存溢出,大文件用流式处理,批量操作需控制并发。

Node.js 中 fs 模块的异步文件读写,核心是避免阻塞主线程,但必须正确处理回调、Promise 和错误,否则容易出现数据丢失、竞态或未捕获异常。
优先使用 Promise 版本(fs.promises)
Node.js 10+ 原生支持 fs.promises,语义清晰、可 await、天然支持 try/catch,比回调更易维护。
- 用
fs.promises.readFile()替代fs.readFile(),返回 Promise,可直接 await - 写入推荐
fs.promises.writeFile()(覆盖)或fs.promises.appendFile()(追加),自动创建目录需自行处理或搭配fs.promises.mkdir(..., { recursive: true }) - 不要混用回调和 Promise —— 同一操作只选一种风格,避免 then/catch 与 callback 并存导致控制流混乱
务必显式处理错误,不忽略 reject 或 callback 的 err 参数
异步 fs 操作失败不会抛出同步异常,而是通过 Promise reject 或回调第一个参数传递错误对象。未处理将导致 unhandledRejection 或静默失败。
- Promise 场景:始终用
try/catch包裹 await,或在链式调用末尾加.catch() - 回调场景:每个
fs.xxx(callback)的 callback 必须检查if (err) { ... },不可省略 - 常见疏忽:
fs.promises.stat()检查文件存在性后直接读取,但中间文件可能被删 —— 应把读取逻辑放在 stat 成功的后续 Promise 链中,或直接捕获读取时的 ENOENT
注意编码与数据类型一致性
读写时若未指定 encoding,readFile 返回 Buffer,writeFile 接收 string 或 Buffer;类型错配会导致乱码或 TypeError。
立即学习“Java免费学习笔记(深入)”;
- 文本操作统一加
{ encoding: 'utf8' }选项,让 API 返回 string,避免手动buf.toString() - 写入 JSON 数据时,先
JSON.stringify(obj)再写入,不要直接 write 对象 - 读取后解析 JSON 要包裹
try/catch,因为文件内容可能格式错误,这不是 fs 错误,而是业务逻辑错误
大文件或高并发场景避免内存/句柄耗尽
fs.promises.readFile 会一次性加载整个文件到内存,对 >100MB 文件或并发量高时风险显著。
- 大文件读取用
fs.createReadStream()+pipe()或事件监听(data/end/error),流式处理 - 批量文件操作(如遍历目录写入多个文件)应控制并发数,可用
p-limit等工具库限制 Promise 并发,防止 EMFILE(打开文件过多) - 临时文件写入建议用
fs.promises.mkdtemp()创建唯一临时目录,操作完成再rm -rf,避免命名冲突和残留










