使用 Node.js 中的 JavaScript SDK 管理 Azure Data Lake Storage 中的目录和文件

本文介绍如何使用 Node.js 在具有分层命名空间的存储帐户中创建和管理目录与文件。

要了解如何获取、设置和更新目录和文件的访问控制列表 (ACL),请参阅使用 Node.js 中的 JavaScript SDK 管理 Azure Data Lake Storage 中的 ACL

包(节点包管理器)” | ”示例” | ”提供反馈

先决条件

  • Azure 订阅。 有关详细信息,请参阅获取 Azure 试用版

  • 一个已启用分层命名空间的存储帐户。 按这些说明创建一个。

  • 如果在 Node.js 应用程序中使用此包,则需要 Node.js 8.0.0 或更高版本。

设置项目

打开一个终端窗口,然后键入以下命令来安装适用于 JavaScript 的 Data Lake 客户端库。

npm install @azure/storage-file-datalake

将此语句放置在代码文件的顶部,以导入 storage-file-datalake 包。

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

注意

Data Lake Storage 上的多协议访问使应用程序能够同时使用 Blob API 和 Data Lake Storage Gen2 API 来处理启用了分层命名空间 (HNS) 的存储帐户中的数据。 使用 Data Lake Storage Gen2 特有的功能(如目录操作和 ACL)时,请使用 Data Lake Storage Gen2 API,如本文所示。

选择要在给定场景中使用的 API 时,请考虑应用程序的工作负载和需求,以及已知问题HNS 对工作负载和应用程序造成的影响

连接到帐户

若要使用本文中的代码片段,需创建一个表示存储帐户的 DataLakeServiceClient 实例。

使用 Microsoft Entra ID 进行连接

可以使用适用于 JS 的 Azure 标识客户端库通过 Microsoft Entra ID 对应用程序进行身份验证。

创建 DataLakeServiceClient 实例并传入 DefaultAzureCredential 类的新实例。

function GetDataLakeServiceClientAD(accountName) {

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

  return dataLakeServiceClient;
}

要详细了解如何使用 DefaultAzureCredential 授权访问数据,请参阅概述:使用 Azure SDK 向 Azure 验证 JavaScript 应用的身份

使用帐户密钥进行连接

可以使用帐户访问密钥(共享密钥)授权访问数据。 此示例将创建使用帐户密钥授权的 DataLakeServiceClient 实例。


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

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

  return dataLakeServiceClient;
}

此授权方法仅适用于 Node.js 应用程序。 如果计划在浏览器中运行代码,则可以使用 Microsoft Entra ID 进行授权。

注意

不建议使用共享密钥进行授权,因为它可能不太安全。 为获得最佳安全性,请禁用存储帐户的共享密钥授权,如阻止对 Azure 存储帐户进行共享密钥授权中所述。

对访问密钥和连接字符串的使用应限于不访问生产数据或敏感数据的初始概念证明应用或开发原型。 否则,在向 Azure 资源进行身份验证时,应始终优先使用 Azure SDK 中提供的基于令牌的身份验证类。

Azure 建议客户端使用 Microsoft Entra ID 或共享访问签名 (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 应用程序。 如果打算在浏览器中运行代码,请参阅适用于 JavaScript 的 Azure Storage File Data Lake 客户端库自述文件来查看有关如何在浏览器中执行此操作的示例。

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

}

另请参阅