Zarządzanie katalogami i plikami w usłudze Azure Data Lake Storage Gen2 za pomocą zestawu SDK języka JavaScript w Node.js

W tym artykule pokazano, jak używać Node.js do tworzenia katalogów i plików oraz plików na kontach magazynu, które mają hierarchiczną przestrzeń nazw.

Aby dowiedzieć się, jak pobierać, ustawiać i aktualizować listy kontroli dostępu (ACL) katalogów i plików, zobacz Używanie zestawu SDK języka JavaScript w Node.js do zarządzania listami ACL w usłudze Azure Data Lake Storage Gen2.

Package (Node Menedżer pakietów) | Przykłady | dają opinię

Wymagania wstępne

  • Subskrypcja platformy Azure. Aby uzyskać więcej informacji, zobacz Uzyskiwanie bezpłatnej wersji próbnej platformy Azure.

  • Konto magazynu z włączoną hierarchiczną przestrzenią nazw. Postępuj zgodnie z tymi instrukcjami, aby je utworzyć.

  • Jeśli używasz tego pakietu w aplikacji Node.js, potrzebujesz Node.js 8.0.0 lub nowszej.

konfigurowanie projektu

Zainstaluj bibliotekę klienta usługi Data Lake dla języka JavaScript, otwierając okno terminalu, a następnie wpisując następujące polecenie.

npm install @azure/storage-file-datalake

Zaimportuj storage-file-datalake pakiet, umieszczając tę instrukcję w górnej części pliku kodu.

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

Uwaga

Dostęp do wielu protokołów w usłudze Data Lake Storage umożliwia aplikacjom korzystanie zarówno z interfejsów API obiektów blob, jak i interfejsów API usługi Data Lake Storage Gen2 do pracy z danymi na kontach magazynu z włączoną hierarchiczną przestrzenią nazw (HNS). Podczas pracy z funkcjami unikatowymi dla usługi Data Lake Storage Gen2, takimi jak operacje katalogów i listy ACL, użyj interfejsów API usługi Data Lake Storage Gen2, jak pokazano w tym artykule.

Podczas wybierania interfejsów API, które mają być używane w danym scenariuszu, należy wziąć pod uwagę obciążenie i potrzeby aplikacji wraz ze znanymi problemami i wpływem sieci HNS na obciążenia i aplikacje.

Połączenie do konta

Aby użyć fragmentów kodu w tym artykule, należy utworzyć wystąpienie Elementu DataLakeServiceClient reprezentujące konto magazynu.

Połączenie przy użyciu identyfikatora Entra firmy Microsoft

Bibliotekę klienta tożsamości platformy Azure dla struktury JS można użyć do uwierzytelniania aplikacji za pomocą identyfikatora Entra firmy Microsoft.

Utwórz wystąpienie Elementu DataLakeServiceClient i przekaż nowe wystąpienie klasy DefaultAzureCredential.

function GetDataLakeServiceClientAD(accountName) {

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

  return dataLakeServiceClient;
}

Aby dowiedzieć się więcej na temat używania wartości DefaultAzureCredential do autoryzowania dostępu do danych, zobacz Omówienie: Uwierzytelnianie aplikacji JavaScript na platformie Azure przy użyciu zestawu Azure SDK.

Połączenie przy użyciu klucza konta

Dostęp do danych można autoryzować przy użyciu kluczy dostępu do konta (klucza współużytkowanego). W tym przykładzie jest tworzone wystąpienie Elementu DataLakeServiceClient autoryzowane za pomocą klucza konta.


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

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

  return dataLakeServiceClient;
}

Ta metoda autoryzacji działa tylko w przypadku aplikacji Node.js. Jeśli planujesz uruchomić kod w przeglądarce, możesz autoryzować przy użyciu identyfikatora Entra firmy Microsoft.

Uwaga

Autoryzacja z kluczem udostępnionym nie jest zalecana, ponieważ może być mniej bezpieczna. Aby uzyskać optymalne zabezpieczenia, wyłącz autoryzację za pośrednictwem klucza współdzielonego dla konta magazynu, zgodnie z opisem w temacie Zapobieganie autoryzacji klucza współdzielonego dla konta usługi Azure Storage.

Korzystanie z kluczy dostępu i parametry połączenia powinno być ograniczone do początkowego sprawdzania koncepcji lub prototypów programistycznych, które nie uzyskują dostępu do danych produkcyjnych ani poufnych. W przeciwnym razie klasy uwierzytelniania oparte na tokenach dostępne w zestawie Azure SDK powinny być zawsze preferowane podczas uwierzytelniania w zasobach platformy Azure.

Firma Microsoft zaleca, aby klienci używali identyfikatora Entra firmy Microsoft lub sygnatury dostępu współdzielonego (SAS), aby autoryzować dostęp do danych w usłudze Azure Storage. Aby uzyskać więcej informacji, zobacz Autoryzacja operacji na potrzeby dostępu do danych.

Tworzenie kontenera

Kontener działa jako system plików. Możesz go utworzyć, uzyskując wystąpienie FileSystemClient, a następnie wywołując metodę FileSystemClient.Create.

W tym przykładzie zostanie utworzony kontener o nazwie my-file-system.

async function CreateFileSystem(dataLakeServiceClient) {

  const fileSystemName = "my-file-system";

  const fileSystemClient = dataLakeServiceClient.getFileSystemClient(fileSystemName);

  const createResponse = await fileSystemClient.create();

}

Tworzenie katalogu

Utwórz odwołanie do katalogu, uzyskując wystąpienie DirectoryClient, a następnie wywołując metodę DirectoryClient.create.

W tym przykładzie zostanie dodany katalog o nazwie my-directory do kontenera.

async function CreateDirectory(fileSystemClient) {

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

  await directoryClient.create();

}

Zmienianie nazwy lub przenoszenie katalogu

Zmień nazwę lub przenieś katalog, wywołując metodę DirectoryClient.rename . Przekaż ścieżkę żądanego katalogu parametru.

W tym przykładzie zmieniono nazwę podkatalogu na nazwę my-directory-renamed.

async function RenameDirectory(fileSystemClient) {

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

}

W tym przykładzie zostanie przeniesiony katalog o nazwie my-directory-renamed do podkatalogu katalogu o nazwie my-directory-2.

async function MoveDirectory(fileSystemClient) {

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

}

Usuwanie katalogu

Usuń katalog, wywołując metodę DirectoryClient.delete .

W tym przykładzie usunięto katalog o nazwie my-directory.

async function DeleteDirectory(fileSystemClient) {

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

}

Przekazywanie pliku do katalogu

Najpierw odczytaj plik. W tym przykładzie użyto modułu Node.js fs . Następnie utwórz odwołanie do pliku w katalogu docelowym, tworząc wystąpienie FileClient, a następnie wywołując metodę FileClient.create. Przekaż plik, wywołując metodę FileClient.append . Pamiętaj, aby ukończyć przekazywanie, wywołując metodę FileClient.flush .

W tym przykładzie plik tekstowy jest przekazywany do katalogu o nazwie 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);

}

Pobieranie z katalogu

Najpierw utwórz wystąpienie FileSystemClient reprezentujące plik, który chcesz pobrać. Użyj metody FileSystemClient.read, aby odczytać plik. Następnie zapisz plik. W tym przykładzie do tego celu użyto modułu Node.js fs .

Uwaga

Ta metoda pobierania pliku działa tylko dla aplikacji Node.js. Jeśli planujesz uruchomić kod w przeglądarce, zobacz bibliotekę klienta usługi Azure Storage File Lake dla pliku readme języka JavaScript , aby zapoznać się z przykładem tego, jak to zrobić w przeglądarce.

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;
  });
}

Wyświetlanie zawartości katalogu

W tym przykładzie są wyświetlane nazwy każdego katalogu i pliku znajdującego się w katalogu o nazwie 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}`);
  }

}

Zobacz też