Contents

Como ler e escrever arquivos JSON no Node.js

É possível ler e escrever arquivos JSON no Node.js. Tudo o que você precisa fazer é utilizar o módulo fs conforme detalhado em nosso guia fácil de seguir.

Leitura e gravação de arquivos JSON no Node.js

O JavaScript Object Notation (JSON) é um padrão de transferência de dados altamente prevalente, particularmente conhecido por sua capacidade de representar informações organizadas de maneira concisa. Este formato, que se caracteriza pela sua natureza textual, facilita a compreensão por parte dos utilizadores humanos, ao mesmo tempo que permite uma análise e geração perfeitas por parte dos sistemas de processamento de máquinas.

A utilização da capacidade de análise e geração automatizadas de dados JSON no Node.js facilita o armazenamento, a transmissão e a manipulação eficientes e sem esforço de informações estruturadas. Obtenha uma compreensão abrangente da leitura, composição e modificação de ficheiros JSON através da utilização do componente do sistema de ficheiros Node.js.

O módulo do sistema de ficheiros Node.js

O módulo do sistema de ficheiros Node.js, que está inerentemente incorporado no ambiente Node.js, permite aos utilizadores comunicar com o sistema de ficheiros do seu dispositivo através de várias funcionalidades, tais como ler ficheiros, criar novos ficheiros e eliminá-los, entre outras.

As funcionalidades oferecidas pelo módulo de sistema de ficheiros estão disponíveis em duas modalidades distintas, podendo proceder de forma assíncrona ou síncrona. As operações assíncronas não impedem o andamento da sua aplicação, pois permitem o processamento simultâneo com outras tarefas. Os métodos que seguem este padrão têm normalmente uma designação que significa a sua natureza assíncrona. Por exemplo, é possível encontrar designações como “Async” ou “await” anexadas ao nome do método, por exemplo, readFileAsync ou writeFileAsync .

Enquanto os métodos síncronos suspendem a execução do programa até à conclusão da operação do sistema de ficheiros, os métodos assíncronos permitem que o programa prossiga com outras tarefas em simultâneo, utilizando uma função de retorno de chamada que é executada após a conclusão da operação. Exemplos ilustrativos incluem as funções readFile e writeFile.

Para preservar a caraterística de não-bloqueio do loop de eventos e melhorar a eficiência geral e a rapidez de uma aplicação ao lidar com ficheiros, é imperativo utilizar técnicas assíncronas em todas as interacções com o sistema de ficheiros.

Em casos específicos em que a simplicidade é fundamental e a operação é pouco frequente, como em tarefas básicas de scripting ou manipulações de ficheiros de utilização única, as abordagens assíncronas podem não ser necessárias e as técnicas síncronas podem revelar-se uma solução eficiente.

Lendo arquivos JSON com o módulo fs

Para processar um arquivo JSON usando JavaScript assíncrono, é necessário importar o módulo de sistema de arquivos assíncrono para o arquivo de script primário. Isso pode ser feito incluindo uma instrução de importação no início do arquivo, conforme demonstrado abaixo:

 const fs = require("node:fs/promises");

Se estiver utilizando uma versão do Node.js anterior à versão 18, é necessário importar o módulo fs de uma maneira como a seguinte:

 const fs = require("fs/promises");

Se desejar importar o módulo completo, incluindo os componentes síncronos e assíncronos, é necessário omitir o “/promises” da instrução de importação.

Utilizando a função readFile , é possível examinar o conteúdo de um ficheiro JSON fornecendo como parâmetros um caminho de diretório e um objeto de configuração opcional. Este objeto de configuração pode ser um objeto JavaScript que contém várias preferências de leitura ou uma cadeia de caracteres que encapsula um esquema de codificação predeterminado.

As opções do objeto incluem:

O parâmetro especificado determina o conjunto de caracteres utilizado durante o processo de leitura de um determinado documento, sendo a configuração padrão “utf8”, que é tipicamente utilizada para conteúdo textual e “binary” que se aplica a ficheiros de dados não textuais.

O símbolo asterisco (*) seguido de parênteses, entre chavetas ({}), indica um argumento opcional cujo valor predefinido é “r”, que representa o modo de leitura ao abrir um ficheiro num sistema de ficheiros específico. Outros modos comuns de acesso a ficheiros incluem “w” para o modo só de escrita e “a” para o modo de anexação.

Por exemplo:

 fs.readFile("./users.json", { encoding: "utf-8", flag: "r" })
  .then((data) => {
    const users = JSON.parse(data);
    console.log(users);
  })
  .catch((error) => {
    console.error('Error reading the JSON file:', error);
  });

A aplicação atual foi concebida para processar informações armazenadas num ficheiro denominado “users.json”, que se encontra nas imediações do ponto de execução do software. Para extrair o conteúdo deste ficheiro específico, é possível utilizar a funcionalidade incorporada fornecida pela linguagem de programação utilizada. Especificamente, o método conhecido como “JSON.parse” pode ser invocado sobre os dados recuperados, a fim de os converter num objeto JavaScript. Ao fazê-lo, o utilizador ganha a capacidade de interagir e modificar a informação nele contida, tudo dentro dos limites da sua base de código.

Quando se lida com ficheiros JSON mais pequenos, pode-se utilizar a função require para analisar de forma síncrona esses ficheiros e converter o seu conteúdo em objectos JavaScript. No entanto, para ficheiros JSON mais substanciais ou quando se trabalha num contexto assíncrono, recomenda-se a utilização do método fs.readFile .É importante notar que a abordagem require tem o potencial de armazenar em cache a totalidade do conteúdo do ficheiro na memória, o que pode resultar em dificuldades caso os dados JSON sofram alterações frequentes.

Escrever ficheiros JSON com o módulo fs

A função writeFile permite a criação e escrita de dados num formato JSON, fornecendo-lhe três parâmetros, nomeadamente o caminho do ficheiro, os dados a serem escritos e uma função de retorno opcional.

⭐Um caminho de ficheiro.

A informação que se destina a ser armazenada num ficheiro pode assumir várias formas, tais como uma cadeia de caracteres, uma memória intermédia, um iterável assíncrono ou um objeto iterável.

⭐Um objeto de configuração opcional.

Esta abordagem específica utiliza operações assíncronas com o objetivo de escrever dados num ficheiro especificado. Nos casos em que o referido ficheiro já existe, o seu conteúdo atual será substituído pelos dados fornecidos, substituindo efetivamente qualquer informação anterior que possa ter sido armazenada no mesmo. Por outro lado, nos casos em que o ficheiro ainda não existe, esta técnica cria-o e preenche-o subsequentemente com os dados passados como entrada, assegurando assim que toda a informação necessária é guardada com sucesso na localização de armazenamento designada.

Por exemplo:

 const fakeUsers = [
  {
    id: 1,
    name: "John Doe",
    username: "johndoe123",
    address: {
      street: "123 Main St",
      city: "Anytown",
    },
  },
  {
    id: 2,
    name: "Jane Smith",
    username: "janesmith456",
    address: {
      street: "456 Elm St",
      city: "Another City",
    },
  }
];

fs.writeFile("./users.json", JSON.stringify(fakeUsers), {
  encoding: "utf-8",
  flag: "w",
}).catch((error) => {
  console.error('Error writing the JSON file:', error);
});

uma cadeia de caracteres ou uma memória intermédia. Se pretender guardar um objeto no referido ficheiro, é necessário transformá-lo previamente numa cadeia de caracteres utilizando o método JSON.stringify.

Atualização de ficheiros JSON com o módulo fs

O código fornecido não oferece um método direto para modificar ficheiros, uma vez que escrever num ficheiro apaga o seu conteúdo anterior.

Para superar esse desafio, uma abordagem é recuperar o conteúdo existente do arquivo utilizando a função readFile . Posteriormente, pode-se concatenar os dados actualizados com a informação recuperada e fornecer ambos os conjuntos de dados como entrada para a operação writeFile .

Certamente, aqui está um exemplo de uma função em Python que incorpora a lógica descrita:

 const updateFile = async (filePath, data) => {
  try {
    const fileContents = await fs.readFile(filePath, {
      encoding: "utf-8",
      flag: "r",
    });

    const fileData = JSON.parse(fileContents);

    const updatedFileData = [...fileData, ...data];

    await fs.writeFile(filePath, JSON.stringify(updatedFileData), {
      encoding: "utf-8",
      flag: "w",
    });

    return "File updated successfully";
  } catch (error) {
    console.error('Error updating the JSON file:', error);
  }
};

Pode chamar a função da seguinte forma:

 updateFile("./users.json", [
  {
    id: 4,
    name: "Jane Doe",
    username: "janedoe123",
    address: {
      street: "123 Main St",
      city: "Anytown",
    },
  },
  {
    id: 5,
    name: "John Smith",
    username: "johnsmith456",
    address: {
      street: "456 Elm St",
      city: "Another City",
    },
  }
]).then((message) => {
  console.log(message);
});

Este trecho de código anexará os detalhes dos utilizadores mencionados a um ficheiro JSON existente chamado “users.json”.

Considerações de segurança para leitura e gravação de arquivos JSON

Garantir a segurança de um aplicativo Node.js que manipula arquivos JSON é fundamental, pois essas ações envolvem aspectos críticos de proteção.É essencial verificar a validade dos dados JSON para garantir a conformidade com as especificações predefinidas. Além disso, a limitação das permissões de acesso aos ficheiros e a limpeza das entradas do utilizador são medidas eficazes contra potenciais ameaças, como ataques de injeção de código.