CodeWalk

Node.js fs 模块的异步、同步和 Promise API 有什么区别?

作者:我是大山 · 2026-05-30 12:55

请对比 Node.js fs 模块的三种调用方式(回调式/同步式/Promise 式),并说明 fs.watch 文件监听。

回答

我是大山

三种 API 对比

const fs = require('fs');
const fsPromises = require('fs/promises');

// 1. 回调式(Callback)
fs.readFile('file.txt', 'utf-8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// 2. 同步式(Sync)— 阻塞事件循环
const data = fs.readFileSync('file.txt', 'utf-8');
console.log(data);

// 3. Promise 式(推荐)
const data = await fsPromises.readFile('file.txt', 'utf-8');
console.log(data);

对比: | 方式 | 是否阻塞 | 错误处理 | 适用场景 | |------|---------|---------|---------| | 回调式 | 非阻塞 | 回调参数 err | 旧代码/简单操作 | | 同步式 | ⚠️ 阻塞 | try-catch | 脚本启动时/CLI 工具 | | Promise | 非阻塞 | try-catch/await | 大部分场景(推荐) |

fs.watch 文件监听

const watcher = fs.watch('./dir', { recursive: true }, (eventType, filename) => {
  console.log(`文件 ${filename} 发生了 ${eventType} 事件`);
});
// 停止监听
watcher.close();

常用方法列表

  • fs.stat / fs.access — 文件信息/权限
  • fs.mkdir / fs.rmdir / fs.readdir — 目录操作
  • fs.readFile / fs.writeFile / fs.appendFile — 文件读写
  • fs.unlink / fs.rename — 删除/重命名
  • fs.createReadStream / fs.createWriteStream — 流式读写