O módulo fs do Node.js
O módulo fs disponibiliza diversas funcionalidades úteis para acessar e interagir com o file system.
Não há necessidade de intalá-lo. Sendo parte do núcleo do Node.js, basta importar para poder usá-lo:
const fs = require('fs')
Feito isso, você tem acesso a todos os métodos dele, o que inclui:
fs.access(): checa se o arquivo existe e se o Node.js pode acessá-lo com suas permissões atuaisfs.appendFile(): acrescenta dados em um arquivo. Se o arquivo não existir, ele é criado.fs.chmod(): muda as permissões de um arquivo especificado pelo nome que foi passado. Relacionado:fs.lchmod(),fs.fchmod()fs.chown(): muda o proprietário e o grupo do arquivo especificado pelo nome que foi passado. Relacionado:fs.fchown(),fs.lchown()fs.close(): fecha um descriptor de arquivofs.copyFile(): copia um arquivofs.createReadStream(): cria uma stream de arquivo para leiturafs.createWriteStream(): cria uma stream de arquivo para escritafs.link(): cria um novo hard link para um arquivofs.mkdir(): cria um novo diretóriofs.mkdtemp(): cria um novo diretório temporáriofs.open(): define o file modefs.readdir(): lê os conteúdos de um diretóriofs.readFile(): lê os conteúdos de um arquivo. Relacionado:fs.read()fs.readlink(): lê o valor de um link simbólicofs.realpath(): resolve caminhos relativos de arquivo com ponteiros (.,..) para o caminho completofs.rename(): renomeia um arquivo ou pastafs.rmdir(): deleta um diretóriofs.stat(): retorna o status do arquivo identificado pelo nome que foi passado. Relacionado:fs.fstat(),fs.lstat()fs.symlink(): cria um novo link simbólico para um arquivofs.truncate(): trunca o arquivo identificado pelo nome que foi passado para o tamanho especificado. Relacionado:fs.ftruncate()fs.unlink(): remove um arquivo ou um link simbólicofs.unwatchFile(): para de observar mudanças em um arquivofs.utimes(): muda a timestamp do arquivo identificado pelo nome que foi passado. Relacionado:fs.futimes()fs.watchFile(): começa a observar muddanças em um arquivo. Relacionado:fs.watch()fs.writeFile(): escreve dados em um arquivo. Relacionado:fs.write()
Uma coisa peculiar sobre o módulo fs é que todos os métodos são assíncronos por padrão, mas eles também podem rodar de forma síncrona adicionando Sync no nome.
Por exemplo:
fs.rename()fs.renameSync()fs.write()fs.writeSync()
Isso faz uma enorme diferença no fluxo da sua aplicação.
O Node.js 10 inclui suporte experimental para uma API baseada em promises
Por exemplo, vamos analisar o método fs.rename(). A API assíncrona é usada com uma callback:
const fs = require('fs')fs.rename('before.json', 'after.json', err => {if (err) {return console.error(err)}// feito})
Uma API síncrona pode ser usada com um bloco de try/catch para tratar erros:
const fs = require('fs')try {fs.renameSync('before.json', 'after.json')// feito} catch (err) {console.error(err)}
A principal diferença aqui é que a execução do seu script no segundo exemplo vai bloquear a thread, até que a operação no arquivo seja bem-sucedida.