Zarządzanie katalogami i plikami w usłudze Azure Data Lake Storage 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.
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.
Nawiązywanie połączenia z kontem
Aby użyć fragmentów kodu w tym artykule, należy utworzyć wystąpienie Elementu DataLakeServiceClient reprezentujące konto magazynu.
Nawiązywanie połączenia 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.
Nawiązywanie połączenia 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}`);
}
}