Node.js: 6 dicas do módulo File System

Node.js File System
Node.js File System

Neste artigo, vou lhe mostrar algumas dicas de um dos módulos principais do Node.js que é o File System, mais conhecido como ‘fs’.

Este módulo fornece operações de I/O (Input/Output ou E/S, Entrada/Saída) através de wrappers simples ao redor de funções POSIX. Para usar o módulo fs (File System) você deve usar o comando require (‘fs’), sendo que todos os métodos possuem versões assíncronas e síncronas.

Veremos neste artigo:

  1. fs assíncrono ou síncrono?
  2. Use file streams
  3. Cópia de arquivos
  4. Não use fs.access
  5. Limitações do fs.watch
  6. Módulos adicionais ao fs

Vamos lá!

Curso FullStack

#1 – fs assíncrono ou síncrono?

Você sempre deve procurar usar a API assíncrona quando desenvolver código que vai para produção, uma vez que esta API Não bloqueia o event loop e permite que você construa aplicações com maior performance. Um exemplo de código usando ‘fs’ assíncrono pode ser visto abaixo:

Já a API síncrona pode ser usada quando estiver construindo provas de conceito ou pequenas aplicações. O código abaixo faz a mesma coisa que o anterior, mas usando a variante síncrona da mesma função:

Agora se você deseja transformar em assíncrono mesmo as funções tradicionalmente síncronas do fs, sugiro usar a função promisify da biblioteca util, transformando qualquer função “callback-based” em promises, além de oferecer suporte a async/await. Mas espere, este recurso funciona apenas à partir da versão 8 do Node.

A imagem abaixo, cortesia do Armando Magalhães do grupo de Node.js do Facebook, mostra como funciona:

Promisify
Promisify

#2 – Use File Streams

Infelizmente é muito comum ver desenvolvedores de várias linguagens negligenciando o uso de File Streams. Streams em Node.js são conceitos poderosos que lhe permitem manter um consumo baixíssimo de memória e alta performance nas aplicações que precisavam ler e escrever arquivos.

Streams são estruturas Node.js que lhe permitem manipular dados. Existem três conceitos importantes que você deve entender:

  • source – o objeto de onde seus dados vêm;
  • pipeline – por onde seus dados passam (você pode filtrar ou modificar eles aqui);
  • sink – onde seus dados vão parar (terminam);

Um guia completo sobre Streams pode ser encontrado neste link.

Livro Node.js com MySQL

#3 – Cópia de arquivos

Uma vez que o módulo fs não expõe uma função para copiar arquivos, você pode facilmente fazê-lo com streams:

Uma das vantagens de se usar streams para isso é que você consegue transformar os arquivos enquanto eles estão sendo copiados, como por exemplo, fazer uma descompressão:

#4 – Não use fs.access

O propósito da função fs.access é verificar se um usuário possui permissões para um dado arquivo ou caminho, algo como isto:

Note que o segundo parâmetro espera uma ou mais constantes para verificação de permissão. São elas:

  • fs.constants.F_OK – verifica se o path é visível para esse processo;
  • fs.constants.R_OK – verifica se o path pode ser lido por esse processo;
  • fs.constants.W_OK – verifica se o path pode ser escrito por esse processo;
  • fs.constants.X_OK – verifica se o path pode ser executado por esse processo;

Entretanto, note que usar fs.access para verificar a acessibilidade de um arquivo antes de chamar fs.open, fs.readFile ou fs.writeFile não é recomendado e a razão é simples: se você o fizer, outro processo pode alterar o arquivo entre a sua verificação e a ação de usar o arquivo propriamente dita.

Ao invés de verificar, tente usar o arquivo diretamente e trate os possíveis erros que podem acontecer.

Curso Node.js e MongoDB
Curso Node.js e MongoDB

#5 – Limitações do fs.watch

A função fs.watch é usada para escutar/observar por alterações em um arquivo ou pasta. No entanto a API fs.watch não é 100% consistente entre as diferentes plataformas e em alguns sistemas nem mesmo é disponível:

  • no Linux, usa inotify;
  • no BSD, usa kqueue;
  • no OS X, usa kqueue para arquivos e FSEvents para pasras;
  • no SunOS (incluindo Solaris e SmartOS), usa event ports;
  • no Windows, esta feature depend de ReadDirectoryChangesW;

Note também que a opção recursiva somente é suportada no OS X e Windows, mas não no Linux.

Além disso, o argumento filename no callback do watch nem sempre é fornecido (além de somente ser suportado no Linux e Windows), logo, prepare-se com fallbacks em caso dele vir undefined:

#6 – Módulos adicionais ao fs

Muitos desenvolvedores não concordam exatamente como o módulo fs funciona e criaram versões alternativas e muito úteis. Outros criam extensões ao fs para expandir as funcionalidades do módulo original. Alguns módulos bem famosos com essas características são:

graceful-fs

Este módulo é um substituto ao fs com algumas melhorias:

  • chamadas de open e readdir são enfileiradas e são automaticamente retentadas em caso de erros como EMFILE;
  • ignora erros EINVAL e EPERM em chown, fchown ou lchown se o usuário não é root;
  • faz com que lchmod e lchown se tornem noops, em caso de indisponibilidade;
  • retenta a leitura do arquivo se o read retornar erro EAGAIN;

Você pode usar esse módulo assim como usaria o módulo fs ou alternativamente substituindo o módulo globalmente:

mock-fs

O módulo mock-fs permite ao módulo fs original usar a memória RAM como se fosse um disco temporário para mockar o sistema de arquivos e facilitar os testes. Ele é bem fácil de usar:

lockfile

File locking é uma maneira de restringir o acesso a um arquivo permitindo somente um processo acessar o arquivo de cada vez. Isto previne problemas de concorrência a um determinado arquivo atuando como um semáforo. Adicionar lockfiles usando o módulo lockfile é bem simples (como tudo em Node, aliás):

fs-extra

É um substituto ao fs tradicional adicionando novas funções e suporte a promises. Foi criado pois o autor afirma que estava cansado de ficar usando mkdirp, rimraf e ncp em seus projetos. Como um autêntico substituto, possui todos as funções originais do fs além de novas funções.

Estas foram algumas dicas relacionados ao módulo File System (fs) do Node.js. E aí, conhece alguma que eu não listei? Deixa aí nos comentários!

Curtiu o post? Então clica no banner abaixo e dá uma conferida no meu livro sobre programação web com Node.js!

Publicado por

Luiz Duarte

Pós-graduado em computação, professor, empreendedor, autor, Agile Coach e programador nas horas vagas.