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。
三种写法
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');
大文件用流
一次性 writeFile 会把全部内容读进内存,写大文件应该用流:
const stream = fs.createWriteStream('big.log');
for (let i = 0; i < 1e6; i++) {
const ok = stream.write(`line ${i}\n`);
if (!ok) await new Promise(r => stream.once('drain', r)); // 背压控制
}
stream.end();
写入 JSON
await fsp.writeFile('data.json', JSON.stringify(obj, null, 2));
常见问题(FAQ)
Q:目录不存在会报错吗?
会(ENOENT)。先 await fsp.mkdir(dir, { recursive: true }) 创建目录再写文件。
Q:writeFileSync 什么时候能用?
命令行脚本、构建工具等一次性任务里没问题;服务器代码里不要用,阻塞期间所有请求都无法处理。
Q:怎么指定编码?
第三个参数传 'utf8'(默认就是);写二进制数据传 Buffer,不要传编码。