CodeWalk

Node.js fs 模块的异步、同步与 Promise API 对比

作者:孤独的心 · 2026-05-30 12:55

请对比 Node.js fs 模块中 callback 风格、同步 sync 风格、以及 fs.promises(Promise 风格)三种 API 的使用差异和性能/异常处理区别。

回答

孤独的心

三种 API 风格

1. Callback 风格(传统)

const fs = require('fs');
fs.readFile('/file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
  • 回调地狱问题,需手动嵌套
  • 错误优先回调(error-first)模式

2. Sync 风格

const data = fs.readFileSync('/file.txt', 'utf8');
  • 同步阻塞事件循环,应用初始化/CLI 脚本可用
  • 生产环境 HTTP 请求中严禁使用(阻塞所有并发)
  • 异常通过 try/catch 捕获

3. Promise 风格(fs.promises)

const fs = require('fs/promises');
async function readFile() {
  try {
    const data = await fs.readFile('/file.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}
  • Node.js 10+ 稳定,推荐方式
  • 可与 async/await 配合,异常通过 try/catch
  • 性能等同 callback 风格,不阻塞事件循环

性能对比:异步版本(callback + promise)利用线程池(libuv default 4 线程),I/O 操作不阻塞主线程。同步版本直接阻塞。

最佳实践:新项目全部使用 fs.promisesfs/promises