Manipulando arquivos INI com Node.js

O que é o formato INI?

O formato de arquivo INI é um padrão informal para arquivos de configuração para algumas plataformas ou software. Arquivos INI são arquivos de texto simples com uma estrutura básica composta de “seções” e “propriedades”. Caso queira saber mais, recomendo que siga a leitura neste artigo, lá você entenderá melhor sobre tais arquivos.

Este tipo de formato costuma ser utilizado para armazenar parâmetros mutáveis, ou seja, dados que podem ser alterados em um ambiente de produção, sem a necessidade de recompilar ou reiniciar seu servidor. Imagina um ambiente onde você precise armazenar endereços da web que podem ser alterados constantemente pelo administrador do sistema. Três classes utilizam a mesma URL. Imagine você ter que entrar no código fonte de cada uma para alterar? Muito trabalho desnecessário, não?

Obviamente você poderia utilizar o banco de dados para isso, mas nem sempre é a melhor escolha quando se trata de configurações. As vezes precisamos que as configurações operem independente da base de dados da aplicação.

Vamos ao que interessa.

Os arquivos INI utilizam um formato extremamente simples para arquivos de configuração que consistem em seções, propriedades e valores. Vamos considerar um arquivo de configuração INI simples, armazenando tags.

  1. [tags]
  2. tag1 = Exemplo de tag!
  3. tag2 = Esta é a segunda tag..
  4. tag3 = Quantas tags posso colocar nisso?

Criamos a seção tags, e nela possuímos chave e valor (chave => tag1, valor => “Exemplo de tag!”). Bem simples de se entender, né?

Agora imagine um arquivo de configuração:

  1. [producao]
  2. porta = 3306
  3. ip = 192.168.1.2
  4. admin = superAdminUser123
  5. [desenvolvimento]
  6. porta = 3307
  7. ip = 192.168.1.1
  8. admin = rafael

Neste exemplo fictício, temos duas seções: uma para um suposto ambiente de desenvolvimento e outra para de produção. Poderíamos separar diversas configurações dos ambientes dessa forma, facilitando nossa vida de dev.

Configuração inicial

Para começar, vamos instalar o excelente pacote ini. Primeiro, crie um projeto com o arquivo package.json padrão, se você ainda não tiver um:

$ npm init -y

Depois, vamos instalar o pacote responsável pelo INI:

$ npm install –save ini

Criando e lendo nosso primeiro arquivo INI

Primeiramente, vamos criar um arquivo INI  para armazenar algumas configurações. Vamos criar um arquivo simples com uma chave(website) e valor(uma url qualquer).

  1. ; Arquivo de configuração INI
  2. website = zerobugs.com.br

Salve o arquivo como “config.ini”. Vamos ler e analisar o arquivo de configuração INI e recuperar o valor de website:

  1. const fs = require(‘fs’);
  2. const ini = require(‘ini’);
  3. const config = ini.parse(fs.readFileSync(‘./config.ini’, ‘utf-8’));
  4. const website = config.website;
  5. console.log(website);

Usamos a função require nas linhas 1-2 para importar os módulos fs e ini e utilizar em nosso programa. Na linha 4, usamos a função ini.parse com o fs para ler nosso arquivo de configuração config.ini. Armazenando este resultado em config, podemos simplesmente utilizar o objeto e recuperar nosso website com config.website. Bem simples, né?

Lendo dados de uma seção

Vamos usar o exemplo anterior onde temos uma seção de desenvolvimento e outra de produção:

  1. [producao]
  2. porta = 3306
  3. ip = 192.168.1.2
  4. admin = superAdminUser123
  5. [desenvolvimento]
  6. porta = 3307
  7. ip = 192.168.1.1
  8. admin = rafael

Vamos utilizar as mesmas funções para recuperar nosso arquivo:

  1. const fs = require(‘fs’);
  2. const ini = require(‘ini’);
  3. const config = ini.parse(fs.readFileSync(‘./config.ini’, ‘utf-8’));
  4. console.log(config.desenvolvimento);

O programa irá retornar o seguinte resultado:

{ porta: ‘3307’, ip: ‘192.168.1.1’, admin: ‘rafael’ }

Se trocarmos por console.log(config.producao):

{ porta: ‘3306’, ip: ‘192.168.1.2’, admin: ‘superAdminUser123’ }

Caso queiramos armazenar um dado específico do objeto, podemos fazer da seguinte forma:

  1. const producaoIp = config.producao.ip;
  2. console.log(“IP do servidor em produção: ” + producaoIp);

No console deverá aparecer:

IP do servidor em produção: 192.168.1.2

Escrevendo em um arquivo INI

Agora vamos modificar nosso código para podermos escrever no arquivo. Adicione as seguintes linhas:

  1. config.desenvolvimento.ip = ‘127.0.0.1’;
  2. config.producao.porta = ‘3308’;
  3. config.producao.novaChave = ‘Esta é uma nova chave!’
  4. fs.writeFileSync(‘./config_modified.ini’, ini.stringify(config))

Alteramos o ip da seção desenvolvimento para “127.0.0.1” em seguida, alteramos a porta da produção para “3308”. Adicionamos uma nova chave chamada novaChave ao ambiente de produção com o valor “Esta é uma nova chave!”.

Por fim, chamamos uma função de escrita em arquivo, utilizando o fs. Para isso basta fazer fs.writeFileSync. Troquei o nome do arquivo para não sobrescrever o anterior, para que possamos visualizar a diferença nos dois arquivos. Como resultado teremos o seguinte arquivo:

  1. [producao]
  2. porta=3308
  3. ip=192.168.1.2
  4. admin=superAdminUser123
  5. novaChave=Esta é uma nova chave!
  6. [desenvolvimento]
  7. porta=3307
  8. ip=127.0.0.1
  9. admin=rafael

Utilizando Arrays

Para finalizar, vamos dar uma olhada em como utilizar arrays em nossos arquivos de configuração.

Primeiro, vamos criar um arquivo INI com a seguinte estrutura:

  1. [animais]
  2. nomes[] = cachorro
  3. nomes[] = gato
  4. nomes[] = pássaro

Agora vamos recuperar os dados da seguinte forma:

  1. const fs = require(‘fs’);
  2. const ini = require(‘ini’);
  3. const animaisConfig = ini.parse(fs.readFileSync(‘./animais.ini’, ‘utf-8’));
  4. const nomeAnimais = animaisConfig.animais.nomes;
  5. console.log(nomeAnimais);

Como resultado, teremos um array da seguinte forma: [ ‘cachorro’, ‘gato’, ‘pássaro’ ]

Conclusão

Os arquivos INI fornecem um formato muito simples de ser utilizado e altamente versátil, com aplicabilidade em diversas situações. Agora você já pode utilizar-los em suas aplicações Node.js, viu?

Você pode acessar o código fonte do tutorial aqui: https://github.com/raframil/nodejswithini.

  • @cpdrenato

Renato Lucena

Developer PHP, Laravel. Goiania-GO https://www.linkedin.com/in/renato-de-oliveira-lucena-33777133/

Você pode gostar...