引入
文件路径在不同操作系统上分隔符不同,直接拼接字符串容易出错。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服务。