Node.js 如何向文件追加内容?

Node.js 追加文件用 fs.appendFile(回调)、fs.promises.appendFile(async/await)或 fs.appendFileSync(同步);大数据量用 fs.createWriteStream 的 flag:'a' 流式追加。本文给出四种写法与适用场景。

最佳实践
文件、模块与依赖组织示意

小数据用 fs.appendFile,大数据/持续写入用 fs.createWriteStream 加 { flag: 'a' }。

方式一:fs.appendFile(回调式)

const fs = require('fs');

fs.appendFile('log.txt', '新的一行\n', (err) => {
  if (err) {
    console.error('追加失败:', err);
    return;
  }
  console.log('追加成功');
});

文件不存在会自动创建——这也是它和 writeFile 的关键区别(writeFile 会覆盖原文件)。

方式二:Promise 版(async/await 推荐)

const fs = require('fs').promises;

await fs.appendFile('log.txt', '新的一行\n');

方式三:同步版(脚本场景)

const fs = require('fs');
fs.appendFileSync('log.txt', '新的一行\n');

同步会阻塞事件循环,只在 CLI 脚本、启动初始化等场景用。

方式四:流式追加(大文件/高频写入)

const fs = require('fs');

const stream = fs.createWriteStream('big.log', { flags: 'a' });  // flags:'a' 表示追加
stream.write('第一块数据\n');
stream.write('第二块数据\n');
stream.end();

流式写入不会一次性把内容装进内存,写日志收集器、导出大文件时必须用它。

怎么选

场景 方法
偶尔追加几行 fs.promises.appendFile
脚本里同步写 fs.appendFileSync
高频/大量持续写入 fs.createWriteStream({flags:'a'})

常见问题(FAQ)

Q:appendFile 和 writeFile 带 flag:'a' 有区别吗?
功能等价,都是追加。appendFile 语义更清晰,推荐用它。

Q:并发追加同一个文件会串行吗?
并发 appendFile 调用的先后顺序不保证,应用层一次追加也不一定对应单次系统写入。需要完整记录与确定顺序时,应串行等待写入或统一使用一个写入队列;跨进程与网络文件系统还需额外协调。

Q:追加中文乱码?
确认写入字符串编码一致(Node 默认 UTF-8);如果是从别处读来的 Buffer,直接传 Buffer 而不做字符串转换。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台