Использование пакета SDK JavaScript в Node.js для управления каталогами и файлами в Azure Data Lake Storage
В этой статье показано, как использовать Node.js для создания каталогов и файлов в учетных записях хранения с иерархическим пространством имен, а также управления ими.
Сведения о том, как получить, задать и обновить списки управления доступом (ACL) каталогов и файлов, см. в Node.js с помощью пакета SDK JavaScript для управления списками управления доступом в Azure Data Lake Storage.
Пакет (диспетчер пакетов узла) | Примеры | Обратная связь
Необходимые компоненты
Подписка 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 Storage позволяет приложениям использовать 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}`);
}
}