fs.readFile)带回调,不阻塞"> fs.readFile)带回调,不阻塞"> fs.readFile)带回调,不阻塞">
Node.js 词条目录
前端Wiki/Node.js/进阶/文件系统 fs

同步与异步 API

fs 模块的大多数 API 都有“同步”与“异步”两个版本:异步函数(如 fs.readFile)带回调,不阻塞主线程;同步函数(如 fs.readFileSync)立即返回结果,但会卡住整个进程。

服务器代码里应一律用异步版 —— 一个同步调用会阻塞事件循环,所有并发请求都排队等它。同步版只在 CLI 脚本、构建工具、启动时加载配置这类“单线程无并发”场景才推荐使用。

  • 异步版 readFile/readFile/writeFile:回调第一个参数永远是 err(错误优先契约)
  • 同步版 readFileSync/writeFileSync:简单直接,但会阻塞事件循环
  • Node 10+ 的 fs.promises 提供 Promise 版,配合 async/await 最舒服
JS
const fs = require('fs');

// ❌ 同步:服务器里禁止这样写(脚本里无妨)
// const txt = fs.readFileSync('./cfg.json', 'utf8');

// ✅ 回调风格:错误优先
fs.readFile('./cfg.json', 'utf8', (err, data) => {
  if (err) return console.error('读取失败:', err.message);
  console.log('读到', data.length, '字符');
});

// ✅✅ Promise 风格(推荐)
const fsp = require('fs').promises;
(async () => {
  try {
    const txt = await fsp.readFile('./cfg.json', 'utf8');
    console.log('async/await 读到:', txt.slice(0, 20));
  } catch (e) {
    console.error('出错:', e.message);
  }
})();
本节要点服务器只用异步 fs;同步 fs 只留给脚本与启动配置;fs.promises + async/await 是现代写法。