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,不要传编码。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台