fs.readfile卡住主因是未检查回调err参数,node.js不抛异常;路径用path.resolve拼接,读取需指定'utf8'编码;writefile默认覆盖,大文件应使用流式写入。

fs.readFile 读取文件时为什么程序卡住不报错也不继续?
常见原因是传入了不存在的路径,但没写错误处理——fs.readFile 的回调函数第一个参数是 err,必须显式检查。Node.js 不会自动抛异常,错误会被吞掉。
- 务必在回调里加
if (err) { console.error(err); return; } - 路径用
path.resolve()拼接,避免相对路径歧义,比如path.resolve(__dirname, 'data.txt') - 默认编码是
null(返回Buffer),要字符串就显式传'utf8',否则toString()容易出乱码
fs.writeFile 覆盖写入前要不要先判断文件是否存在?
不需要。默认行为就是覆盖写入,fs.writeFile 本身不关心目标文件是否存在。只有当你需要「仅当文件不存在时才写」,才用 fs.open 配合 fs.constants.O_CREAT | fs.constants.O_EXCL 标志。
- 想追加内容用
fs.appendFile,它比先读再拼再写更安全、更省内存 - 写入大文件(>1MB)别用
fs.writeFile,改用fs.createWriteStream流式写入,避免内存爆掉 - 写入 JSON 数据记得先
JSON.stringify(obj, null, 2),不然压缩成一行难调试
Promise 版本的 readFile / writeFile 怎么用才不踩坑?
Node.js 10+ 提供 fs.promises,但直接 require('fs').promises 在某些打包环境(如 Electron)可能失效,推荐用 fs.promises 解构或 util.promisify 包装。
- 正确写法:
const { readFile, writeFile } = require('fs').promises -
await后必须try/catch,Promise 错误不会静默失败,但未捕获会触发unhandledRejection - 并发读多个文件别用
await串行,改用Promise.all([readFile(a), readFile(b)]),否则 I/O 等待时间叠加
同步方法(readFileSync/writeFileSync)到底能不能用?
能用,但只限于 CLI 工具初始化、配置加载、测试脚本等「启动期一次性操作」。在 HTTP 服务或事件循环中调用会阻塞整个进程,所有请求排队等待,哪怕只是读一个 100KB 文件。
- 开发阶段临时调试可以用
readFileSync快速验证逻辑,上线前必须换异步 - 某些构建工具(如 webpack 插件)内部允许同步 I/O,是因为它们运行在独立子进程,不影响主服务
- 如果真要同步且怕阻塞,可起子进程用
child_process.execSync执行 shell 命令读文件,但这属于绕路,不推荐
fs.readFile 到上层路由 handler,中间每层都得透传或处理 err,漏一层就变成「请求没响应也没日志」。











