Kom igång med Azure Blob Storage och JavaScript

Den här artikeln visar hur du ansluter till Azure Blob Storage med hjälp av Azure Blob Storage-klientbiblioteket v12 för JavaScript. När koden är ansluten kan den fungera på containrar, blobar och funktioner i Blob Storage-tjänsten.

Exempelkodfragmenten är tillgängliga i GitHub som körbara Node.js-filer.

API-referenspaket (npm) | Exempel på källkod | | för bibliotek Ge feedback |

Förutsättningar

Konfigurera projektet

  1. Öppna en kommandotolk och ändra till projektmappen. Ändra YOUR-DIRECTORY till mappnamnet:

    cd YOUR-DIRECTORY
    
  2. Om du inte redan har en package.json fil i katalogen initierar du projektet för att skapa filen:

    npm init -y
    
  3. Installera Azure Blob Storage-klientbiblioteket för JavaScript:

    npm install @azure/storage-blob
    
  4. Om du vill använda lösenordslösa anslutningar med hjälp av Microsoft Entra-ID installerar du Azure Identity-klientbiblioteket för JavaScript:

    npm install @azure/identity
    

Auktorisera åtkomst och ansluta till Blob Storage

Microsoft Entra-ID:t ger den säkraste anslutningen genom att hantera anslutningsidentiteten (hanterad identitet). Med den här lösenordslösa funktionen kan du utveckla ett program som inte kräver några hemligheter (nycklar eller anslutningssträng) som lagras i koden.

Konfigurera identitetsåtkomst till Azure-molnet

Om du vill ansluta till Azure utan lösenord måste du konfigurera en Azure-identitet eller använda en befintlig identitet. När identiteten har konfigurerats måste du tilldela lämpliga roller till identiteten.

Om du vill auktorisera lösenordslös åtkomst med Microsoft Entra-ID måste du använda en Azure-autentiseringsuppgift. Vilken typ av autentiseringsuppgifter du behöver beror på var programmet körs. Använd den här tabellen som en guide.

Miljö Metod
Utvecklarmiljö Visual Studio Code
Utvecklarmiljö Tjänstens huvud
Appar med Azure som värd Konfiguration av Azure-värdbaserade appar
Lokal Installation av lokal app

Konfigurera lagringskontoroller

Lagringsresursen måste ha en eller flera av följande Azure RBAC-roller tilldelade till den identitetsresurs som du planerar att ansluta till. Konfigurera Azure Storage-rollerna för varje identitet som du skapade i föregående steg: Azure-moln, lokal utveckling, lokal.

När du har slutfört installationen behöver varje identitet minst en av de lämpliga rollerna:

  • En dataåtkomstroll – till exempel:

    • Storage Blob Data-läsare
    • Storage Blob Data-deltagare
  • En resursroll – till exempel:

    • Läsare
    • Deltagare

Skapa ditt program

När du skapar ditt program interagerar koden främst med tre typer av resurser:

  • Lagringskontot, som är det unika toppnivånamnområdet för dina Azure Storage-data.
  • Containrar som organiserar blobdata i ditt lagringskonto.
  • Blobbar som lagrar ostrukturerade data som text och binära data.

Följande diagram visar relationen mellan de här resurserna.

Diagram of Blob storage architecture

Varje typ av resurs representeras av en eller flera associerade JavaScript-klienter:

Klass Description
BlobServiceClient Representerar Blob Storage-slutpunkten för ditt lagringskonto.
ContainerClient Gör att du kan ändra Azure Storage-containrar och deras blobar.
BlobClient Gör att du kan ändra Azure Storage-blobar.

Skapa ett BlobServiceClient-objekt

BlobServiceClient-objektet är det översta objektet i SDK:et. Med den här klienten kan du ändra tjänsten, containrar och blobar.

När identitetsrollerna för ditt Azure Storage-konto och din lokala miljö har konfigurerats skapar du en JavaScript-fil som innehåller @azure/identity paketet. Skapa en autentiseringsuppgift, till exempel StandardAzureCredential, för att implementera lösenordslösa anslutningar till Blob Storage. Använd den autentiseringsuppgiften för att autentisera med ett BlobServiceClient-objekt .

// connect-with-default-azure-credential.js
const { BlobServiceClient } = require('@azure/storage-blob');
const { DefaultAzureCredential } = require('@azure/identity');
require('dotenv').config()

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error('Azure Storage accountName not found');

const blobServiceClient = new BlobServiceClient(
  `https://${accountName}.blob.core.windows.net`,
  new DefaultAzureCredential()
);

async function main(){
  
  const containerName = 'REPLACE-WITH-EXISTING-CONTAINER-NAME';
  const blobName = 'REPLACE-WITH-EXISTING-BLOB-NAME';

  const timestamp = Date.now();
  const fileName = `my-new-file-${timestamp}.txt`;

  // create container client
  const containerClient = await blobServiceClient.getContainerClient(containerName);

  // create blob client
  const blobClient = await containerClient.getBlockBlobClient(blobName);

  // download file
  await blobClient.downloadToFile(fileName);

  console.log(`${fileName} downloaded`);
  
}

main()
  .then(() => console.log(`done`))
  .catch((ex) => console.log(`error: ${ex.message}`));

Paketet dotenv används för att läsa lagringskontots namn från en .env fil. Den här filen ska inte checkas in i källkontrollen. Om du använder ett lokalt huvudnamn för tjänsten som en del av din StandardAzureCredential-konfiguration kommer all säkerhetsinformation för den autentiseringsuppgiften .env också att gå till filen.

Om du planerar att distribuera programmet till servrar och klienter som körs utanför Azure skapar du en av de autentiseringsuppgifter som uppfyller dina behov.

Skapa ett ContainerClient-objekt

Du kan skapa ContainerClient-objektet antingen från BlobServiceClient eller direkt.

Skapa ContainerClient-objekt från BlobServiceClient

Skapa ContainerClient-objektet från BlobServiceClient.

// Azure Storage dependency
const {
  StorageSharedKeyCredential,
  BlobServiceClient,
} = require("@azure/storage-blob");

// For development environment - include environment variables from .env
require("dotenv").config();

// Azure Storage resource name
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error("Azure Storage accountName not found");

// Azure Storage resource key
const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY;
if (!accountKey) throw Error("Azure Storage accountKey not found");

// Create credential
const sharedKeyCredential = new StorageSharedKeyCredential(
  accountName,
  accountKey
);

const baseUrl = `https://${accountName}.blob.core.windows.net`;
const containerName = `my-container`;

// Create BlobServiceClient
const blobServiceClient = new BlobServiceClient(
  `${baseUrl}`,
  sharedKeyCredential
);

async function main() {
  try {
    // Create container client
    const containerClient = await blobServiceClient.getContainerClient(
      containerName
    );

    // do something with containerClient...
    let i = 1;

    // List blobs in container
    for await (const blob of containerClient.listBlobsFlat()) {
      console.log(`Blob ${i++}: ${blob.name}`);
    }
  } catch (err) {
    console.log(err);
    throw err;
  }
}

main()
  .then(() => console.log(`done`))
  .catch((ex) => console.log(ex.message));

Skapa ContainerClient direkt

// Azure Storage dependency
const {
  ContainerClient
} = require("@azure/storage-blob");

// Azure authentication for credential dependency
const { DefaultAzureCredential } = require('@azure/identity');

// For development environment - include environment variables from .env
require("dotenv").config();

// Azure Storage resource name
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error("Azure Storage accountName not found");

// Azure SDK needs base URL
const baseUrl = `https://${accountName}.blob.core.windows.net`;

// Unique container name
const timeStamp = Date.now();
const containerName = `test`;

async function main() {
  try {
    
    // create container client from DefaultAzureCredential
    const containerClient = new ContainerClient(
      `${baseUrl}/${containerName}`,
      new DefaultAzureCredential()
    );    

    // do something with containerClient...
    let i = 1;

    // List blobs in container
    for await (const blob of containerClient.listBlobsFlat()) {
        console.log(`Blob ${i++}: ${blob.name}`);
    }


  } catch (err) {
    console.log(err);
    throw err;
  }
}

main()
  .then(() => console.log(`done`))
  .catch((ex) => console.log(ex.message));

Paketet dotenv används för att läsa lagringskontots namn från en .env fil. Den här filen ska inte checkas in i källkontrollen.

Skapa ett BlobClient-objekt

Du kan skapa något av BlobClient-objekten, som visas nedan, antingen från en ContainerClient eller direkt.

Lista över Blob-klienter:

Skapa BlobClient-objekt från ContainerClient

// Azure Storage dependency
const {
  StorageSharedKeyCredential,
  ContainerClient
} = require("@azure/storage-blob");

// For development environment - include environment variables from .env
require("dotenv").config();

// Azure Storage resource name
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error("Azure Storage accountName not found");

// Azure Storage resource key
const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY;
if (!accountKey) throw Error("Azure Storage accountKey not found");

// Create credential
const sharedKeyCredential = new StorageSharedKeyCredential(
  accountName,
  accountKey
);

const baseUrl = `https://${accountName}.blob.core.windows.net`;
const containerName = `my-container`;
const blobName = `my-blob`;

// Create ContainerClient
const containerClient = new ContainerClient(
  `${baseUrl}/${containerName}`,
  sharedKeyCredential
);  

async function main() {
  try {
  
    // Create BlobClient object
    const blobClient = containerClient.getBlobClient(blobName);

    // do something with blobClient...
    const properties = await blobClient.getProperties();
    console.log(`Blob ${blobName} properties:`);

    // get BlockBlobClient from blobClient
    const blockBlobClient = blobClient.getBlockBlobClient();

    // do something with blockBlobClient...
    const downloadResponse = await blockBlobClient.download(0);

  } catch (err) {
    console.log(err);
    throw err;
  }
}

main()
  .then(() => console.log(`done`))
  .catch((ex) => console.log(ex.message));

Skapa BlobClient direkt

// Azure Storage dependency
const { BlockBlobClient } = require("@azure/storage-blob");

// Azure authentication for credential dependency
const { DefaultAzureCredential } = require('@azure/identity');

// For development environment - include environment variables from .env
require("dotenv").config();

// Azure Storage resource name
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
if (!accountName) throw Error("Azure Storage accountName not found");

// Azure SDK needs base URL
const baseUrl = `https://${accountName}.blob.core.windows.net`;

// Container must exist prior to running this script
const containerName = `test`;

// Random blob name and contents
const timeStamp = Date.now();
const blobName = `${timeStamp}-my-blob.txt`;
const fileContentsAsString = "Hello there.";

async function main(){

  // Create a client that can authenticate with Azure Active Directory
  const client = new BlockBlobClient(
    `${baseUrl}/${containerName}/${blobName}`,
    new DefaultAzureCredential()
  );

  // Get file url - available before contents are uploaded
  console.log(`blob.url: ${client.url}`);

  // Upload file contents
  const result = await client.upload(fileContentsAsString, fileContentsAsString.length);

  // Get results
  return result;
}

main().then((result) => console.log(result)).catch((ex) => console.log(ex.message));

/*

Response looks like this:

{
  etag: '"0x8DAD247F1F4896E"',
  lastModified: 2022-11-29T20:26:07.000Z,
  contentMD5: <Buffer 9d 6a 29 63 87 20 77 db 67 4a 27 a3 9c 49 2e 61>,
  clientRequestId: 'a07fdd1f-5937-44c7-984f-0699a48a05c0',
  requestId: '3580e726-201e-0045-1a30-0474f6000000',
  version: '2021-04-10',
  date: 2022-11-29T20:26:06.000Z,
  isServerEncrypted: true,
  'content-length': '0',
  server: 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0',
  'x-ms-content-crc64': 'BLv7vb1ONT8=',
  body: undefined
}
*/

Paketet dotenv används för att läsa lagringskontots namn från en .env fil. Den här filen ska inte checkas in i källkontrollen.

Se även