Använda JavaScript SDK i Node.js för att hantera kataloger och filer i Azure Data Lake Storage Gen2

Den här artikeln visar hur du använder Node.js för att skapa och hantera kataloger och filer i lagringskonton som har ett hierarkiskt namnområde.

Mer information om hur du hämtar, anger och uppdaterar åtkomstkontrollistor (ACL) med kataloger och filer finns i Använda JavaScript SDK i Node.js för att hantera ACL:er i Azure Data Lake Storage Gen2.

Paket (Node Package Manager) | Exempel | ger feedback

Förutsättningar

  • En Azure-prenumeration. Mer information finns i Hämta kostnadsfri utvärderingsversion av Azure.

  • Ett lagringskonto som har hierarkiskt namnområde aktiverat. Följ dessa instruktioner för att skapa en.

  • Om du använder det här paketet i ett Node.js program behöver du Node.js 8.0.0 eller senare.

Konfigurera projektet

Installera Data Lake-klientbiblioteket för JavaScript genom att öppna ett terminalfönster och sedan skriva följande kommando.

npm install @azure/storage-file-datalake

storage-file-datalake Importera paketet genom att placera den här instruktionen överst i kodfilen.

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

Kommentar

Med åtkomst med flera protokoll i Data Lake Storage kan program använda både Blob-API:er och Data Lake Storage Gen2-API:er för att arbeta med data i lagringskonton med hierarkisk namnrymd (HNS) aktiverad. När du arbetar med funktioner som är unika för Data Lake Storage Gen2, till exempel katalogåtgärder och ACL:er, använder du API:erna för Data Lake Storage Gen2, som du ser i den här artikeln.

När du väljer vilka API:er som ska användas i ett visst scenario bör du överväga arbetsbelastningen och programmets behov, tillsammans med de kända problemen och effekten av HNS på arbetsbelastningar och program.

Anslut till kontot

Om du vill använda kodfragmenten i den här artikeln måste du skapa en DataLakeServiceClient-instans som representerar lagringskontot.

Anslut med hjälp av Microsoft Entra-ID

Du kan använda Azure Identity-klientbiblioteket för JS för att autentisera ditt program med Microsoft Entra-ID.

Skapa en DataLakeServiceClient-instans och skicka in en ny instans av klassen DefaultAzureCredential .

function GetDataLakeServiceClientAD(accountName) {

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

  return dataLakeServiceClient;
}

Mer information om hur du använder DefaultAzureCredential för att auktorisera åtkomst till data finns i Översikt: Autentisera JavaScript-appar till Azure med hjälp av Azure SDK.

Anslut med hjälp av en kontonyckel

Du kan auktorisera åtkomst till data med hjälp av dina kontoåtkomstnycklar (delad nyckel). I det här exemplet skapas en DataLakeServiceClient-instans som är auktoriserad med kontonyckeln.


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

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

  return dataLakeServiceClient;
}

Den här auktoriseringsmetoden fungerar endast för Node.js program. Om du planerar att köra koden i en webbläsare kan du auktorisera med hjälp av Microsoft Entra-ID.

Varning

Auktorisering med delad nyckel rekommenderas inte eftersom det kan vara mindre säkert. För optimal säkerhet inaktiverar du auktorisering via delad nyckel för ditt lagringskonto enligt beskrivningen i Förhindra auktorisering av delad nyckel för ett Azure Storage-konto.

Användning av åtkomstnycklar och anslutningssträng bör begränsas till inledande konceptbevisappar eller utvecklingsprototyper som inte har åtkomst till produktion eller känsliga data. Annars bör de tokenbaserade autentiseringsklasserna som är tillgängliga i Azure SDK alltid föredras när du autentiserar till Azure-resurser.

Microsoft rekommenderar att klienter använder antingen Microsoft Entra-ID eller en signatur för delad åtkomst (SAS) för att ge åtkomst till data i Azure Storage. Mer information finns i Auktorisera åtgärder för dataåtkomst.

Skapa en container

En container fungerar som ett filsystem för dina filer. Du kan skapa en genom att hämta en FileSystemClient-instans och sedan anropa metoden FileSystemClient.Create .

I det här exemplet skapas en container med namnet my-file-system.

async function CreateFileSystem(dataLakeServiceClient) {

  const fileSystemName = "my-file-system";

  const fileSystemClient = dataLakeServiceClient.getFileSystemClient(fileSystemName);

  const createResponse = await fileSystemClient.create();

}

Skapa en katalog

Skapa en katalogreferens genom att hämta en DirectoryClient-instans och anropa sedan metoden DirectoryClient.create .

I det här exemplet läggs en katalog med namnet my-directory till en container.

async function CreateDirectory(fileSystemClient) {

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

  await directoryClient.create();

}

Byta namn på eller flytta en katalog

Byt namn på eller flytta en katalog genom att anropa metoden DirectoryClient.rename . Skicka sökvägen till den önskade katalogen som en parameter.

Det här exemplet byter namn på en underkatalog till namnet my-directory-renamed.

async function RenameDirectory(fileSystemClient) {

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

}

I det här exemplet flyttas en katalog med namnet my-directory-renamed till en underkatalog till en katalog med namnet my-directory-2.

async function MoveDirectory(fileSystemClient) {

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

}

Ta bort en katalog

Ta bort en katalog genom att anropa metoden DirectoryClient.delete .

Det här exemplet tar bort en katalog med namnet my-directory.

async function DeleteDirectory(fileSystemClient) {

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

}

Ladda upp en fil till en katalog

Läs först en fil. I det här exemplet används modulen Node.js fs . Skapa sedan en filreferens i målkatalogen genom att skapa en FileClient-instans och sedan anropa metoden FileClient.create . Ladda upp en fil genom att anropa metoden FileClient.append . Se till att slutföra uppladdningen genom att anropa metoden FileClient.flush .

I det här exemplet laddas en textfil upp till en katalog med namnet 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);

}

Ladda ned från en katalog

Skapa först en FileSystemClient-instans som representerar den fil som du vill ladda ned. Använd metoden FileSystemClient.read för att läsa filen. Skriv sedan filen. I det här exemplet används modulen Node.js fs för att göra det.

Kommentar

Den här metoden för att ladda ned en fil fungerar bara för Node.js program. Om du planerar att köra koden i en webbläsare kan du se Azure Storage File Data Lake-klientbiblioteket för JavaScript-readme-filen för ett exempel på hur du gör detta i en webbläsare.

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 kataloginnehåll

I det här exemplet skrivs namnen på varje katalog och fil som finns i en katalog med namnet 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}`);
  }

}

Se även