Usar o SDK do JavaScript em Node.js para gerenciar diretórios e arquivos no Azure Data Lake Storage Gen2

Este artigo mostra como usar o Node.js para criar e gerenciar diretórios e arquivos nas contas de armazenamento que têm um namespace hierárquico.

Para saber mais sobre como obter, definir e atualizar as ACLs (listas de controle de acesso) de diretórios e arquivos, confira Usar o SDK do JavaScript no Node.js para gerenciar ACLs no Azure Data Lake Storage Gen2.

Pacote (Gerenciador de pacotes do Node) | Exemplos | Enviar comentários

Pré-requisitos

  • Uma assinatura do Azure. Para obter mais informações, confira Obter a avaliação gratuita do Azure.

  • Uma conta de armazenamento precisa ter o namespace hierárquico habilitado. Siga estas instruções para criar um.

  • Se você estiver usando esse pacote em um aplicativo Node.js, será necessário o Node.js 8.0.0 ou superior.

Configurar o seu projeto

Instale biblioteca de clientes do Data Lake para JavaScript abrindo uma janela de terminal e, em seguida, digitando o comando a seguir.

npm install @azure/storage-file-datalake

Importe o pacote storage-file-datalake colocando essa instrução na parte superior do seu arquivo de código.

const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");

Observação

O acesso a vários protocolos no Data Lake Storage permite que os aplicativos usem APIs de Blob e APIs do Data Lake Storage Gen2 para trabalhar com dados em contas de armazenamento com o namespace hierárquico (HNS) habilitado. Ao trabalhar com recursos exclusivos do Data Lake Storage Gen2, como operações de diretório e ACLs, use as APIs do Data Lake Storage Gen2, conforme mostrado neste artigo.

Ao escolher quais APIs usar em um determinado cenário, considere a carga de trabalho e as necessidades do aplicativo, juntamente com os problemas conhecidos e o impacto do HNS em cargas de trabalho e aplicativos.

Conectar à conta

Para usar os trechos de código neste artigo, será necessário criar uma instância de DataLakeServiceClient que representa a conta de armazenamento.

Conectar usando o Microsoft Entra ID

É possível usar a Biblioteca de clientes de identidade do Azure para JS para autenticar o aplicativo com o Microsoft Entra ID.

Crie uma instância DataLakeServiceClient e passe em uma nova instância da classe DefaultAzureCredential.

function GetDataLakeServiceClientAD(accountName) {

  const dataLakeServiceClient = new DataLakeServiceClient(
      `https://${accountName}.dfs.core.windows.net`,
      new DefaultAzureCredential());

  return dataLakeServiceClient;
}

Para saber mais sobre como usar DefaultAzureCredential para autorizar o acesso a dados, confira Visão geral: Autenticar aplicativos JavaScript no Azure usando o SDK do Azure .

Conectar-se usando uma chave de conta

Você pode autorizar o acesso aos dados usando as chaves de acesso da sua conta (Chave Compartilhada). Esse exemplo cria uma instância DataLakeServiceClient autorizada com a chave de conta.


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

  const dataLakeServiceClient = new DataLakeServiceClient(
      `https://${accountName}.dfs.core.windows.net`, sharedKeyCredential);

  return dataLakeServiceClient;
}

Esse método de autorização funciona apenas para aplicativos Node.js. Se planeja executar seu código em um navegador, é possível autorizar usando o Microsoft Entra ID.

Cuidado

A autorização com Chave Compartilhada não é recomendada, pois pode ser menos segura. Para uma segurança ideal, desabilite a autorização por meio da Chave Compartilhada para sua conta de armazenamento, conforme descrito em Impedir autorização de Chave Compartilhada para uma conta do Armazenamento do Microsoft Azure.

O uso de chaves de acesso e cadeias de conexão deve ser limitado a aplicativos iniciais de prova de conceito ou protótipos de desenvolvimento que não acessem dados confidenciais ou de produção. Caso contrário, as classes de autenticação baseadas em token disponíveis no SDK do Azure devem ser sempre preferenciais ao autenticar recursos do Azure.

A Microsoft recomenda que os clientes usem o Microsoft Entra ID ou uma assinatura de acesso compartilhado (SAS) para autorizar o acesso aos dados no Armazenamento do Microsoft Azure. Para obter mais informações, confira Autorizar operações para acesso a dados.

Criar um contêiner

Um contêiner atua como um sistema de arquivos para seus arquivos. Para criar um, obtenha uma instância de FileSystemClient e chame o método FileSystemClient.Create.

Este exemplo cria um contêiner chamado my-file-system.

async function CreateFileSystem(dataLakeServiceClient) {

  const fileSystemName = "my-file-system";

  const fileSystemClient = dataLakeServiceClient.getFileSystemClient(fileSystemName);

  const createResponse = await fileSystemClient.create();

}

Criar um diretório

Para criar uma referência de diretório, obtenha uma instância de DirectoryClient e chame o método DirectoryClient.Create.

Este exemplo adiciona um diretório chamado my-directory a um contêiner.

async function CreateDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory");

  await directoryClient.create();

}

Renomear ou mover um diretório

Renomeie ou mova um diretório chamando o método DirectoryClient.rename. Passe o caminho do diretório desejado em um parâmetro.

Este exemplo renomeia um subdiretório para o nome my-directory-renamed.

async function RenameDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
  await directoryClient.move("my-directory-renamed");

}

Esse exemplo move um diretório chamado my-directory-renamed para um subdiretório de um diretório chamado my-directory-2.

async function MoveDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory-renamed");
  await directoryClient.move("my-directory-2/my-directory-renamed");

}

Excluir um diretório

Para excluir um diretório, chame o método DirectoryClient.delete.

Este exemplo exclui um diretório chamado my-directory.

async function DeleteDirectory(fileSystemClient) {

  const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
  await directoryClient.delete();

}

Carregar um arquivo em um diretório

Primeiro, leia um arquivo. Este exemplo usa o módulo do Node.js fs. Depois, para criar uma referência de arquivo no diretório de destino, crie uma instância de FileClient e chame o método FileClient.create. Para carregar um arquivo, chame o método FileClient.append. Para concluir o upload, chame o método FileClient.flush.

Este exemplo carrega um arquivo de texto para um diretório chamado my-directory.

async function UploadFile(fileSystemClient) {

  const fs = require('fs')

  var content = "";

  fs.readFile('mytestfile.txt', (err, data) => {
      if (err) throw err;

      content = data.toString();

  })

  const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");
  await fileClient.create();
  await fileClient.append(content, 0, content.length);
  await fileClient.flush(content.length);

}

Baixar de um diretório

Primeiro, crie uma instância de FileSystemClient que representa o arquivo que você deseja baixar. Use o método FileSystemClient.read para ler o arquivo. Em seguida, grave o arquivo. Este exemplo usa o módulo do Node.js fs para fazer isso.

Observação

Esse método de baixar um arquivo funciona apenas para aplicativos Node.js. Para executar o código em um navegador, confira o arquivo leia-me da biblioteca de clientes do File Data Lake do Armazenamento do Azure para JavaScript para ver um exemplo de como fazer isso em um navegador.

async function DownloadFile(fileSystemClient) {

  const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");

  const downloadResponse = await fileClient.read();

  const downloaded = await streamToString(downloadResponse.readableStreamBody);

  async function streamToString(readableStream) {
    return new Promise((resolve, reject) => {
      const chunks = [];
      readableStream.on("data", (data) => {
        chunks.push(data.toString());
      });
      readableStream.on("end", () => {
        resolve(chunks.join(""));
      });
      readableStream.on("error", reject);
    });
  }

  const fs = require('fs');

  fs.writeFile('mytestfiledownloaded.txt', downloaded, (err) => {
    if (err) throw err;
  });
}

Listar conteúdo do diretório

Este exemplo, imprime os nomes de cada diretório e arquivo localizado em um diretório chamado my-directory.

async function ListFilesInDirectory(fileSystemClient) {

  let i = 1;

  let iter = await fileSystemClient.listPaths({path: "my-directory", recursive: true});

  for await (const path of iter) {

    console.log(`Path ${i++}: ${path.name}, is directory: ${path.isDirectory}`);
  }

}

Confira também