Uso de JavaScript en Node.js para administrar directorios y archivos en Azure Data Lake Storage Gen2
En este artículo se explica cómo usar Node.js para crear y administrar directorios y archivos en cuentas de almacenamiento que tengan habilitado un espacio de nombres jerárquico.
Para obtener información sobre cómo obtener, establecer y actualizar las listas de control de acceso (ACL) de directorios y archivos, consulte Uso del SDK de JavaScript en Node.js para administrar listas de control de acceso en Azure Data Lake Storage Gen2.
Paquete (Administrador de paquetes de Node) | Ejemplos | Enviar comentarios
Requisitos previos
Suscripción a Azure. Para obtener más información, vea Obtención de una evaluación gratuita de Azure.
Una cuenta de almacenamiento que tenga habilitado un espacio de nombres jerárquico. Siga estas instrucciones para crear uno.
Si utiliza este paquete en una aplicación de Node.js, necesitará Node.js 8.0.0 o una versión posterior.
Configurar su proyecto
Instale la biblioteca cliente de Data Lake para JavaScript; para ello, abra una ventana de terminal y, a continuación, escriba el siguiente comando.
npm install @azure/storage-file-datalake
Importe el paquete storage-file-datalake
colocando esta instrucción en la parte superior del archivo de código.
const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");
Nota:
El acceso a varios protocolos en Data Lake Storage permite a las aplicaciones usar las API de blobs y las API de Data Lake Storage Gen2 para trabajar con datos en cuentas de almacenamiento con el espacio de nombres jerárquico (HNS) habilitado. Al trabajar con capacidades exclusivas de Data Lake Storage Gen2, como las operaciones de directorio y las ACL, use las API de Data Lake Storage Gen2, como se muestra en este artículo.
Al elegir qué API usar en un escenario determinado, tenga en cuenta la carga de trabajo y las necesidades de la aplicación, junto con los problemas conocidos y el impacto de HNS en cargas de trabajo y aplicaciones.
Conexión con la cuenta
Para usar los fragmentos de código de este artículo, tiene que crear una instancia de DataLakeServiceClient que represente la cuenta de almacenamiento.
Conexión mediante el Microsoft Entra ID
Puede usar la biblioteca cliente de identidad de Azure para JS para autenticar la aplicación con Microsoft Entra ID.
Cree una instancia de DataLakeServiceClient y pase una nueva instancia de la clase DefaultAzureCredential.
function GetDataLakeServiceClientAD(accountName) {
const dataLakeServiceClient = new DataLakeServiceClient(
`https://${accountName}.dfs.core.windows.net`,
new DefaultAzureCredential());
return dataLakeServiceClient;
}
Para más información sobre el uso de DefaultAzureCredential para autorizar el acceso a los datos, consulte Información general: Autenticación de aplicaciones de JavaScript en Azure mediante el SDK de Azure.
Conexión con una clave de cuenta
Puede autorizar el acceso a los datos mediante las claves de acceso de la cuenta (clave compartida). En este ejemplo se crea una instancia de DataLakeServiceClient autorizada con la clave de cuenta.
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 autorización solo funciona para aplicaciones de Node.js. Si tiene previsto ejecutar el código en un explorador, puede autorizarlo mediante Microsoft Entra ID.
Precaución
No se recomienda la autorización con clave compartida, ya que puede ser menos segura. Para obtener una seguridad óptima, deshabilite la autorización mediante clave compartida para la cuenta de almacenamiento, como se describe en Impedir la autorización de clave compartida para una cuenta de Azure Storage.
El uso de claves de acceso y cadenas de conexión debe limitarse a la prueba inicial de aplicaciones de concepto o prototipos de desarrollo que no tienen acceso a datos confidenciales o de producción. De lo contrario, siempre se deben preferir las clases de autenticación basadas en tokens disponibles en el SDK de Azure al autenticarse en los recursos de Azure.
Microsoft recomienda que los clientes usen Microsoft Entra ID o una firma de acceso compartido (SAS) para autorizar el acceso a los datos de Azure Storage. Para obtener más información, consulte Autorización de operaciones para el acceso a datos.
Crear un contenedor
Un contenedor actúa como sistema de archivos para sus archivos. Puede crear uno mediante la obtención de una instancia de FileSystemClient y, a continuación, llamar al método FileSystemClient.Create.
En este ejemplo se crea un contenedor denominado my-file-system
.
async function CreateFileSystem(dataLakeServiceClient) {
const fileSystemName = "my-file-system";
const fileSystemClient = dataLakeServiceClient.getFileSystemClient(fileSystemName);
const createResponse = await fileSystemClient.create();
}
Creación de un directorio
Cree una referencia de directorio obteniendo una instancia de DirectoryClient y, a continuación, llame al método DirectoryClient.create.
En este ejemplo se agrega un directorio denominado my-directory
a un contenedor.
async function CreateDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
await directoryClient.create();
}
Cambio de nombre o traslado de un directorio
Cambie el nombre de un directorio o muévalo llamando al método DirectoryClient.rename. Pase la ruta de acceso del directorio que busca a un parámetro.
En este ejemplo, se cambia el nombre de un subdirectorio a my-directory-renamed
.
async function RenameDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
await directoryClient.move("my-directory-renamed");
}
En este ejemplo se mueve un directorio denominado my-directory-renamed
a un subdirectorio de un directorio denominado my-directory-2
.
async function MoveDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory-renamed");
await directoryClient.move("my-directory-2/my-directory-renamed");
}
Eliminación de un directorio
Elimine un directorio llamando al método DirectoryClient.delete.
En este ejemplo se elimina un directorio denominado my-directory
.
async function DeleteDirectory(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
await directoryClient.delete();
}
Carga de un archivo en un directorio
Primero, lea un archivo En este ejemplo se usa el módulo fs
de Node.js. A continuación, cree una referencia de archivo en el directorio de destino creando una instancia de FileClient y, a continuación, llamando al método FileClient.create. Cargue un archivo llamando al método FileClient.append. Asegúrese de completar la carga llamando al método FileClient.flush.
En este ejemplo se carga un archivo de texto en un directorio denominado 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);
}
Descarga de un directorio
En primer lugar, cree una instancia de FileSystemClient que represente al archivo que quiere descargar. Use el método FileSystemClient.read para leer el archivo. A continuación, escriba el archivo. En este ejemplo se usa el módulo fs
de Node.js para ello.
Nota:
Este método de descarga de un archivo solo funciona para aplicaciones de Node.js. Si tiene previsto ejecutar el código en un explorador, consulte el archivo Léame de Azure Storage File Data Lake client library for JavaScript para obtener un ejemplo de cómo hacerlo en un explorador.
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;
});
}
Lista del contenido del directorio
En este ejemplo se imprimen los nombres de cada directorio y archivo que se encuentra en un directorio denominado 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}`);
}
}