Node 文件操作怎样避免阻塞、路径穿越和竞态?

先理解原理和示例,再练习完整口述与追问。

fs/promises;路径白名单与边界校验;权限与符号链接;避免先 exists 再操作;原子替换按平台处理。

服务请求路径上同步 fs 操作会阻塞当前 JS 线程,普通文件任务优先异步 API。用户给的文件名不应直接拼进可访问路径;需要固定根目录、规范化候选路径、确认它仍位于允许范围,并处理符号链接及实际权限。只看字符串是否以根目录开头可能把相似前缀的其他目录误认为合法。

先 exists 再 read 会在两步间发生变化,正确做法通常是直接操作并处理 ENOENT/EACCES 等错误。写入配置可用同目录临时文件再替换,但并发写、崩溃一致性和平台语义仍需单独设计。

下载接口只接受服务端生成的文件 ID,先查该用户可访问的真实记录,再映射存储路径;不把 ?path=../../secret 作为直接路径。处理用户上传时限制大小、类型、数量与文件名,不信任客户端 Content-Type。

path.resolve 只做路径解析,不执行授权。符号链接可改变真实目标;异常不能被吞成“文件为空”。

我用异步文件 API,授权先于读取,路径固定在受控目录并校验真实目标;直接处理操作结果而非依赖 exists 快照。写入按并发和平台要求设计替换,失败明确记录并返回合适错误。