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

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

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

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

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

const fs = require('fs');

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

appendFile 和 writeFile 默认都可创建不存在的文件;区别在默认模式:appendFile 追加,writeFile 截断已有文件。

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

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

async function main() {
  await fs.appendFile('log.txt', '新的一行\n');
}
main().catch((err) => {
  console.error('追加失败:', err);
  process.exitCode = 1;
});

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

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.on('error', (err) => console.error('写入失败:', err));
stream.write('第一块数据\n');
stream.write('第二块数据\n');
stream.end();

流式写入可分块处理;大量持续写入时必须在 write 返回 false 后等待 drain,避免内存缓冲持续增长。finish 表示流写入已交付到底层,不自动保证断电持久性;并非所有大文件场景都必须使用流。

怎么选

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

常见问题(FAQ)

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

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

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

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台