Usar o SDK do JavaScript no Node.js para gerenciar diretórios e arquivos no Armazenamento do Azure Data Lake
Este artigo mostra como usar o Node.js para criar e gerenciar diretórios e arquivos em contas de armazenamento que têm um namespace hierárquico.
Para saber como obter, definir e atualizar as listas de controle de acesso (ACL) de diretórios e arquivos, consulte Usar o SDK do JavaScript no Node.js para gerenciar ACLs no Armazenamento do Azure Data Lake.
Pacote (Gerenciador de Pacotes de Nó) | Exemplos | Dão Comentários
Pré-requisitos
Uma subscrição do Azure. Para obter mais informações, consulte Obter avaliação gratuita do Azure.
Uma conta de armazenamento com namespace hierárquico habilitado. Siga estas instruções para criar um.
Se você estiver usando este pacote em um aplicativo Node.js, precisará Node.js 8.0.0 ou superior.
Configure o seu projeto
Instale a biblioteca de cliente Data Lake para JavaScript abrindo uma janela de terminal e digitando o seguinte comando.
npm install @azure/storage-file-datalake
Importe o storage-file-datalake
pacote colocando esta instrução na parte superior do arquivo de código.
const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");
Nota
O acesso multiprotocolo 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 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 seu aplicativo, juntamente com os problemas conhecidos e o impacto do HNS em cargas de trabalho e aplicativos.
Conecte-se à conta
Para usar os trechos deste artigo, você precisará criar uma instância DataLakeServiceClient que represente a conta de armazenamento.
Conectar-se usando o Microsoft Entra ID
Você pode usar a biblioteca de cliente de identidade do Azure para JS para autenticar seu aplicativo com o Microsoft Entra ID.
Crie uma instância DataLakeServiceClient e passe 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 aos dados, consulte 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). Este exemplo cria uma instância DataLakeServiceClient que é 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;
}
Este método de autorização funciona apenas para aplicações Node.js. Se você planeja executar seu código em um navegador, você pode autorizar usando o Microsoft Entra ID.
Atenção
A autorização com chave compartilhada não é recomendada, pois pode ser menos segura. Para uma segurança ideal, desative a autorização através da Chave Partilhada para a sua conta de armazenamento, conforme descrito em Impedir autorização de Chave Partilhada para uma conta de Armazenamento do Azure.
O uso de chaves de acesso e cadeias de conexão deve ser limitado a aplicativos de prova de conceito iniciais ou protótipos de desenvolvimento que não acessam dados confidenciais ou de produção. Caso contrário, as classes de autenticação baseada em token disponíveis no SDK do Azure devem sempre ser preferidas ao autenticar nos 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 Azure. Para obter mais informações, consulte Autorizar operações para acesso a dados.
Criar um contentor
Um contêiner atua como um sistema de arquivos para seus arquivos. Você pode criar um obtendo uma instância FileSystemClient e, em seguida, chamando 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
Crie uma referência de diretório obtendo uma instância DirectoryClient e, em seguida, chamando o método DirectoryClient.create .
Este exemplo adiciona um diretório nomeado 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 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");
}
Este exemplo move um diretório nomeado 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");
}
Eliminar um diretório
Exclua um diretório chamando 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 ficheiro para um diretório
Primeiro, leia um arquivo. Este exemplo usa o módulo Node.js fs
. Em seguida, crie uma referência de arquivo no diretório de destino criando uma instância FileClient e, em seguida, chamando o método FileClient.create . Carregue um arquivo chamando o método FileClient.append . Certifique-se de concluir o upload chamando o método FileClient.flush .
Este exemplo carrega um arquivo de texto em 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);
}
Download de um diretório
Primeiro, crie uma instância FileSystemClient que represente o arquivo que você deseja baixar. Use o método FileSystemClient.read para ler o arquivo. Em seguida, escreva o arquivo. Este exemplo usa o módulo Node.js fs
para fazer isso.
Nota
Este método de download de um arquivo funciona apenas para aplicativos Node.js. Se você planeja executar seu código em um navegador, consulte o arquivo Leiame da biblioteca de cliente do Azure Storage File Data Lake para JavaScript para obter 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}`);
}
}