Управление каталогами и файлами в Azure Data Lake Storage 2-го поколения с помощью пакета SDK для JavaScript в Node.js

В этой статье показано, как использовать Node.js для создания каталогов и файлов в учетных записях хранения с иерархическим пространством имен, а также управления ими.

Дополнительные сведения о получении, установке и обновлении списков управления доступом (ACL) для каталогов и файлов см. в разделе Использование пакета SDK для JavaScript для управления списками ACL в Azure Data Lake Storage 2-го поколения.

Пакет (диспетчер пакетов узла) | Примеры | Обратная связь

Необходимые компоненты

  • Подписка Azure. См. дополнительные сведения о бесплатной пробной версии Azure.

  • Учетная запись хранения, в которой включено иерархическое пространство имен. Выполните эти инструкции, чтобы создать учетную запись.

  • Если вы используете этот пакет в приложении Node.js, вам потребуется Node.js 8.0.0 или более поздней версии.

Настройка проекта

Установите клиентскую библиотеку Data Lake для JavaScript. Для этого откройте окно терминала и введите приведенную ниже команду.

npm install @azure/storage-file-datalake

Импортируйте пакет storage-file-datalake, разместив этот оператор в верхней части файла кода.

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

Примечание.

Доступ с несколькими протоколами в Data Lake служба хранилища позволяет приложениям использовать API BLOB-объектов и DATA LAKE STORAGE 2-ГО ПОКОЛЕНИЯ API для работы с данными в учетных записях хранения с включенным иерархическим пространством имен (HNS). При работе с возможностями, уникальными для Data Lake Storage 2-го поколения, таких как операции каталогов и списки управления доступом, используйте API Data Lake Storage 2-го поколения, как показано в этой статье.

При выборе API для использования в данном сценарии рассмотрите рабочую нагрузку и потребности приложения, а также известные проблемыи влияние HNS на рабочие нагрузки и приложения.

Подключение к учетной записи

Чтобы использовать фрагменты кода из этой статьи, необходимо создать экземпляр DataLakeServiceClient, представляющий учетную запись хранения.

Подключение с помощью идентификатора Microsoft Entra

Вы можете использовать клиентская библиотека удостоверений Azure для JS для проверки подлинности приложения с помощью идентификатора Microsoft Entra.

Создайте экземпляр DataLakeServiceClient и передайте новый экземпляр класса DefaultAzureCredential.

function GetDataLakeServiceClientAD(accountName) {

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

  return dataLakeServiceClient;
}

Дополнительные сведения об использовании DefaultAzureCredential для авторизации доступа к данным см. в статье "Обзор: проверка подлинности приложений JavaScript в Azure с помощью пакета SDK Azure".

Подключение с помощью ключа учетной записи

Вы можете авторизовать доступ к данным с помощью ключей доступа к учетной записи (общий ключ). В этом примере создается экземпляр DataLakeServiceClient, авторизованный с помощью ключа учетной записи.


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

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

  return dataLakeServiceClient;
}

Этот метод авторизации применим только к приложениям Node.js. Если вы планируете запустить код в браузере, вы можете авторизовать с помощью идентификатора Microsoft Entra.

Внимание

Авторизация с помощью общего ключа не рекомендуется, так как она может быть менее безопасной. Чтобы обеспечить оптимальную безопасность, отключите авторизацию через общий ключ для учетной записи хранения, как описано в разделе "Запрет авторизации общего ключа" для учетной записи служба хранилища Azure.

Использование ключей доступа и строка подключения должно быть ограничено первоначальным подтверждением концепции приложений или прототипов разработки, которые не обращаются к рабочим или конфиденциальным данным. В противном случае классы проверки подлинности на основе маркеров, доступные в пакете SDK Azure, всегда должны быть предпочтительнее при проверке подлинности в ресурсах Azure.

Корпорация Майкрософт рекомендует клиентам использовать идентификатор Microsoft Entra или подписанный URL-адрес (SAS), чтобы авторизовать доступ к данным в служба хранилища Azure. Дополнительные сведения см. в разделе "Авторизация операций для доступа к данным".

Создание контейнера

Контейнер выступает в качестве файловой системы для файлов. Его можно создать, получив экземпляр FileSystemClient, а затем вызвав метод FileSystemClient.Create.

В этом примере создается контейнер с именем my-file-system.

async function CreateFileSystem(dataLakeServiceClient) {

  const fileSystemName = "my-file-system";

  const fileSystemClient = dataLakeServiceClient.getFileSystemClient(fileSystemName);

  const createResponse = await fileSystemClient.create();

}

Создание каталога

Создайте ссылку на каталог, получив экземпляр DirectoryClient, а затем вызвав метод DirectoryClient.create.

В этом примере в контейнер добавляется каталог с именем my-directory.

async function CreateDirectory(fileSystemClient) {

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

  await directoryClient.create();

}

Переименование или перемещение каталога

Переименуйте или переместите каталог, вызвав метод DirectoryClient.rename. Укажите путь к нужному каталогу.

В этом примере переименовывает подкаталог в имя my-directory-renamed.

async function RenameDirectory(fileSystemClient) {

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

}

В этом примере каталог с именем my-directory-renamed перемещается в подкаталог каталога с именем my-directory-2.

async function MoveDirectory(fileSystemClient) {

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

}

Удаление каталога

Удалите каталог, вызвав метод DirectoryClient.delete.

В этом примере удаляется каталог my-directory.

async function DeleteDirectory(fileSystemClient) {

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

}

Отправка файла в каталог

Сначала считайте файл. В этом примере используется модуль Node.js fs. Затем создайте ссылку на файл в целевом каталоге, создав экземпляр FileClient, а затем вызвав метод FileClient.create. Отправьте файл, вызвав метод FileClient.append. Обязательно завершите передачу, вызвав метод FileClient.flush.

В этом примере текстовый файл отправляется в каталог 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);

}

Скачивание из каталога

Сначала создайте экземпляр FileSystemClient, представляющий файл, который требуется скачать. Для чтения файла используйте метод FileSystemClient.read. Затем запишите файл. В этом примере для этого используется модуль Node.js fs.

Примечание.

Этот метод загрузки файла работает только для приложений Node.js. Если вы планируете выполнять код в браузере, пример этого приведен в файле сведений Клиентская библиотека Azure Storage File Data Lake для JavaScript.

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

Вывод содержимого каталогов

В этом примере выводятся имена каждого каталога и файла, расположенных в каталоге с именем 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}`);
  }

}

См. также