Node.js 如何写入文件
Node.js 写文件用 fs 模块:fs.writeFile 异步写入、fs.writeFileSync 同步写入,Node 10+ 推荐 fs.promises.writeFile 配合 async/await。追加内容用 fs.appendFile,大文件用 createWriteStream 流式写入。
写文件用内置 fs 模块:异步用 fs.writeFile(path, data, callback),同步用 fs.writeFileSync(path, data),现代代码推荐 fs.promises.writeFile 配合 await。文件不存在会自动创建,已存在则默认覆盖;想追加内容改用 fs.appendFile。
三种写法
以下是三种替代方式,选择其一;不要同时对同一文件并发写入。后续 await 片段需放在 async 函数或 ESM 顶层。
const fs = require('fs');
// 1. 回调式
fs.writeFile('output.txt', '要写入的内容', (err) => {
if (err) console.error('写入失败:', err);
else console.log('写入成功');
});
// 2. 同步式(会阻塞事件循环,脚本/CLI 里可用)
fs.writeFileSync('output.txt', '内容', 'utf8');
// 3. Promise 式(推荐)
const fsp = require('fs/promises');
async function main() {
await fsp.writeFile('output.txt', '内容', 'utf8');
}
追加而不是覆盖
await fsp.appendFile('log.txt', '新的一行\n');
大文件用流
传入完整字符串或 Buffer 时,内容已经占用内存;writeFile 也支持部分迭代输入。需要逐步生成大文件时可用带背压和错误处理的流:
const { Readable } = require('node:stream');
const { pipeline } = require('node:stream/promises');
async function* lines() {
for (let i = 0; i < 1e6; i++) yield `line ${i}\n`;
}
async function writeBigFile() {
await pipeline(Readable.from(lines()), fs.createWriteStream('big.log'));
}
writeBigFile().catch(console.error);
写入 JSON
const obj = { name: 'example', count: 1 };
await fsp.writeFile('data.json', JSON.stringify(obj, null, 2));
常见问题(FAQ)
Q:目录不存在会报错吗?
会(ENOENT)。先 await fsp.mkdir(dir, { recursive: true }) 创建目录再写文件。
Q:writeFileSync 什么时候能用?
命令行脚本、构建工具等一次性任务里没问题;服务器代码里不要用,阻塞期间所有请求都无法处理。
Q:怎么指定编码?
第三个参数传 'utf8'(默认就是);写二进制数据传 Buffer,不要传编码。