引入

文件路径在不同操作系统上分隔符不同,直接拼接字符串容易出错。Node.js 提供 path 处理路径,提供 fs/promises 以 Promise 方式读写文件。

正文

拼接和解析路径

import path from 'node:path';
 
const filePath = path.join(process.cwd(), 'data', 'users.json');
console.log(path.basename(filePath));
console.log(path.extname(filePath));

不要手动写死 /\\ 来拼接跨平台路径。process.cwd() 是启动命令所在的当前工作目录,不一定是当前模块所在目录。

读写文件

import { readFile, writeFile } from 'node:fs/promises';
 
const filePath = path.join(process.cwd(), 'data', 'users.json');
const content = await readFile(filePath, 'utf8');
const users = JSON.parse(content);
 
await writeFile(filePath, JSON.stringify(users, null, 2) + '\n');

写文件前要确认目录存在,并处理文件不存在、权限不足和内容格式错误等情况。大文件不适合一次性读入内存,可以使用流。

创建目录和判断文件

import { mkdir, access } from 'node:fs/promises';
 
await mkdir(path.join(process.cwd(), 'data'), { recursive: true });
 
try {
  await access(filePath);
} catch {
  console.log('文件不存在或不可访问');
}

安全边界

处理用户传入的文件名时,不要直接把它拼进任意路径。应限制允许的目录和文件类型,并防止路径穿越,例如 ../../secret。文件权限、大小和编码也要纳入校验。

引出

文件 API 解决的是本地 I/O,不等于数据库或对象存储。服务端代码还要考虑并发写入、数据损坏和备份问题。网络输入输出可以继续参考 NodejsHTTP服务