标准答案
- 启动时读取小型配置可以使用同步 API,代码简单且不会影响已接收的请求。
- 请求处理路径中的同步读写会阻塞所有连接,文件越大或磁盘越慢影响越明显。
- 异步 API 仍会消耗文件描述符、线程池或内存,必须有并发和取消边界。
- 文件写入成功不等于业务记录成功,上传、清理和权限状态要保持可恢复。
题目解析
同步 fs API 会占住 JavaScript 主线程,适合启动阶段读取小配置或一次性脚本;在线请求中的同步读写会让同一进程所有连接一起等待。
异步 fs 不等于无限并发:文件描述符、libuv 线程池、磁盘 I/O、Buffer 和下游对象存储仍有边界。大文件应使用 Stream、大小限制和取消。
上传和文件业务还要把路径安全、权限、临时文件、数据库记录和失败清理放进同一状态模型。写文件成功不等于业务提交成功。
常见误区
- 误区:在每个请求里同步读取模板或文件。改正:启动时预加载,或使用异步/流式 API 保护事件循环。
- 误区:异步读文件不限制并发。改正:设置文件大小、任务并发、句柄和内存上限。
- 误区:直接拼接用户输入形成路径。改正:使用受控根目录、规范化路径和权限校验,防止路径穿越。