fs.writeFile(path, data, callback) escreve uma string ou um Buffer em um arquivo. Se o arquivo não existe, o Node o cria; se existe, o conteúdo antigo é substituído. fs.writeFileSync(path, data) faz o mesmo e espera a escrita terminar, e fs.appendFile adiciona no final do arquivo em vez de substituir.
Ele imprime saved e depois o texto que leu de volta; o callback recebe só um erro (ou null), nunca os dados. Passe 42 no lugar da string e a chamada lança TypeError: os dados precisam ser uma string ou um Buffer.
writeFile, writeFileSync e fs/promises
As três formas recebem os mesmos argumentos e mudam no jeito de esperar o resultado.
const fs = require('fs');
const fsp = require('fs/promises');
fs.writeFileSync('a.txt', 'one'); // blocks, throws on error
fs.writeFile('b.txt', 'two', (err) => {}); // callback with err
await fsp.writeFile('c.txt', 'three'); // promise, use in async code
Use writeFileSync em scripts e código de inicialização, e a versão com promise em servidores, onde uma escrita síncrona bloqueia todas as outras requisições até o disco terminar. A página do fs/promises mostra o resto da API com promises.
Adicionar ao arquivo com appendFile
writeFile substitui o arquivo inteiro. Para adicionar uma linha a um log, use appendFile, que também cria o arquivo na primeira vez.
A primeira leitura imprime "second\n", porque o segundo writeFileSync substituiu first, e a segunda imprime "second\nthird\nfourth\n" (o JSON.stringify deixa as quebras de linha visíveis). Coloque o \n você mesmo: nenhuma das duas funções adiciona.
writeFile | appendFile | |
|---|---|---|
| Arquivo não existe | Cria | Cria |
| Arquivo existe | Substitui o conteúdo | Adiciona no final |
| Flag padrão | 'w' | 'a' |
| Uso típico | Salvar um documento inteiro ou JSON | Logs, uma linha por vez |
Não sobrescrever: a opção flag
O terceiro argumento pode ser um objeto de opções. A flag decide o que acontece com um arquivo existente. 'wx' significa "escreva, mas falhe se o arquivo já existir", que é o jeito seguro de criar um arquivo uma única vez.
A segunda chamada falha com EEXIST, então o arquivo continua com abc123. Troque o nome do arquivo da segunda chamada para id2.txt e as duas chamadas imprimem created.
As flags que você mais vai encontrar: 'w' (padrão, substituir), 'a' (adicionar), 'wx' (só criar) e 'ax' (adicionar, mas só em um arquivo novo).
Verificar primeiro com fs.existsSync e depois escrever deixa uma brecha: outro processo pode criar o arquivo entre a verificação e a escrita. 'wx' faz as duas coisas em um passo só.
Escrever JSON em um arquivo
writeFile não aceita objetos. Transforme o objeto em texto com JSON.stringify; o terceiro argumento, 2, indenta a saída para o arquivo ficar legível.
O arquivo guarda o objeto em várias linhas indentadas, e fazer o parse de volta dá um objeto igual, então a última linha imprime 2. Passe o objeto sem JSON.stringify e a chamada lança TypeError.
Crie a pasta antes com mkdir
writeFile cria arquivos, não pastas. Escrever em reports/2026/june.txt quando reports não existe falha com ENOENT. Crie o caminho antes com mkdir e { recursive: true }, que cria todas as pastas que faltam e não faz nada se elas já existem.
A primeira escrita falha com ENOENT; depois do mkdir, a mesma escrita funciona e readdir lista [ 'june.txt' ]. Em código real, monte esses caminhos com path.join para que funcionem no Windows também.
Erros comuns
Achar que o arquivo está escrito logo depois da chamada. fs.writeFile retorna antes de os dados estarem no disco. Leia o arquivo ou comece o próximo passo dentro do callback, ou dê await na versão com promise.
Perder dados escrevendo em um loop. Chamar writeFile uma vez por item substitui o arquivo a cada vez, e só sobra o último item. Use appendFile, ou monte a string inteira e escreva uma vez.
Escrever [object Object]. Passar um objeto por String() ou por uma template literal escreve [object Object]. Use JSON.stringify.
Perguntas frequentes
O fs.writeFile sobrescreve o arquivo?
Sim. Com a flag padrão 'w' ele trunca o arquivo e escreve os dados novos, então o conteúdo antigo se perde. Passe { flag: 'a' } ou use appendFile para adicionar no final.
O fs.writeFile cria o arquivo se ele não existir?
Sim, ele cria o arquivo. Mas não cria pastas que faltam: escrever em logs/app.log quando logs não existe falha com ENOENT.
O que posso passar como dados?
Uma string, um Buffer ou um typed array. Qualquer outra coisa, como um objeto ou um número, lança TypeError, então converta objetos com JSON.stringify e números com String() antes.
É seguro chamar writeFile várias vezes ao mesmo tempo no mesmo arquivo?
Não. Duas chamadas de writeFile em paralelo no mesmo arquivo podem se intercalar e deixar o conteúdo misturado. Espere uma terminar antes de começar a próxima, ou junte os dados e escreva uma vez só.