Udostępnij za pomocą


Tworzenie aplikacji konsolowej Node.js za pomocą usługi Azure DocumentDB

Ten przewodnik ułatwia tworzenie aplikacji konsolowej Node.js w celu nawiązania połączenia z klastrem usługi Azure DocumentDB. Przygotuj swoje środowisko programistyczne, używając pakietu @azure/identity z zestawu Azure SDK dla języka JavaScript do uwierzytelniania, i wykonuj typowe operacje na dokumentach w bazie danych.

Wymagania wstępne

  • Subskrypcja platformy Azure

  • Istniejący klaster usługi Azure DocumentDB

  • Uwierzytelnianie Microsoft Entra zostało skonfigurowane dla klastra z przypisaną rolą dla Twojej tożsamości root.

  • Najnowsza wersja długoterminowego wsparcia (LTS) Node

Konfigurowanie aplikacji konsolowej

Następnie utwórz nowy projekt aplikacji konsolowej i zaimportuj niezbędne biblioteki do uwierzytelniania w klastrze.

  1. Utwórz nowy katalog dla projektu i zainicjuj go za pomocą polecenia npm init.

    mkdir mongodb-app
    cd mongodb-app
    npm init -y
    
  2. Skonfiguruj język TypeScript w projekcie.

    npm install typescript ts-node @types/node --save-dev
    npx tsc --init
    
  3. Utwórz główny plik app.ts TypeScript dla aplikacji.

    touch app.ts
    
  4. Zainstaluj bibliotekę @azure/identity do uwierzytelniania.

    npm install @azure/identity
    
  5. Zainstaluj bibliotekę mongodb .

    npm install mongodb
    

Połącz się z klastrem

Teraz użyj biblioteki Azure.Identity, aby uzyskać TokenCredential, którego możesz użyć do połączenia się z klastrem. Oficjalny sterownik bazy danych MongoDB ma specjalny interfejs, który należy zaimplementować w celu uzyskania tokenów z firmy Microsoft Entra do użycia podczas nawiązywania połączenia z klastrem.

  1. Zaimportuj niezbędne moduły w górnej części pliku JavaScript.

    import { MongoClient } from 'mongodb';
    import { DefaultAzureCredential } from '@azure/identity';
    
  2. Utwórz funkcję zwrotną do obsługi tokenów, która uzyskuje tokeny z instancji TokenCredential w razie potrzeby.

    const azureIdentityTokenCallback = async (_, credential) => {
        const tokenResponse = await credential.getToken(['https://ossrdbms-aad.database.windows.net/.default']);
    
        if (!tokenResponse || !tokenResponse.token) {
            throw new Error('Failed to retrieve a valid access token.');
        }
    
        return {
            accessToken: tokenResponse.token,
            expiresInSeconds: Math.floor((tokenResponse.expiresOnTimestamp - Date.now()) / 1000),
        };
    };
    
  3. Ustaw zmienną nazwy klastra, aby nawiązać połączenie z klastrem usługi Azure DocumentDB.

    const clusterName = '<azure-documentdb-cluster-name>';
    
  4. Utwórz wystąpienie elementu DefaultAzureCredential.

    const credential = new DefaultAzureCredential();
    
  5. Utwórz klienta bazy danych MongoDB skonfigurowanego przy użyciu uwierzytelniania OpenID Connect (OIDC).

    client = new MongoClient(`mongodb+srv://${clusterName}.global.mongocluster.cosmos.azure.com/`, {
        connectTimeoutMS: 120000,
        tls: true,
        retryWrites: true,
        authMechanism: 'MONGODB-OIDC',
        authMechanismProperties: {
            OIDC_CALLBACK: (params) => azureIdentityTokenCallback(params, credential),
            ALLOWED_HOSTS: ['*.azure.com']
        }
    });
    
    console.log('Client created');
    
  1. Zaimportuj niezbędne moduły w górnej części pliku TypeScript.

    import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';
    import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';
    
  2. Utwórz funkcję zwrotną do obsługi tokenów, która uzyskuje tokeny z instancji TokenCredential w razie potrzeby.

    const AzureIdentityTokenCallback = async (params: OIDCCallbackParams, credential: TokenCredential): Promise<OIDCResponse> => {
        const tokenResponse: AccessToken | null = await credential.getToken(['https://ossrdbms-aad.database.windows.net/.default']);
        return {
            accessToken: tokenResponse?.token || '',
            expiresInSeconds: (tokenResponse?.expiresOnTimestamp || 0) - Math.floor(Date.now() / 1000)
        };
    };
    
  3. Ustaw zmienną nazwy klastra, aby nawiązać połączenie z klastrem usługi Azure DocumentDB.

    const clusterName: string = '<azure-documentdb-cluster-name>';
    
  4. Utwórz wystąpienie elementu DefaultAzureCredential.

    const credential: TokenCredential = new DefaultAzureCredential();
    
  5. Utwórz klienta bazy danych MongoDB skonfigurowanego przy użyciu uwierzytelniania OpenID Connect (OIDC).

    const client = new MongoClient(
        `mongodb+srv://${clusterName}.global.mongocluster.cosmos.azure.com/`, {
        connectTimeoutMS: 120000,
        tls: true,
        retryWrites: true,
        authMechanism: 'MONGODB-OIDC',
        authMechanismProperties: {
            OIDC_CALLBACK: (params: OIDCCallbackParams) => AzureIdentityTokenCallback(params, credential),
            ALLOWED_HOSTS: ['*.azure.com']
        }
    });
    
    console.log('Client created');
    

Wykonywanie typowych operacji

Na koniec użyj oficjalnej biblioteki do wykonywania typowych zadań z bazami danych, kolekcjami i dokumentami. W tym miejscu użyjesz tych samych klas i metod, których należy użyć do interakcji z bazą danych MongoDB lub DocumentDB w celu zarządzania kolekcjami i elementami.

  1. Uzyskaj odwołanie do bazy danych według nazwy.

    const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks';
    
    console.log('Database pointer created');
    
  2. Uzyskaj referencję do swojej kolekcji.

    const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products';
    
    console.log('Collection pointer created');
    
  3. Utwórz dokument przy użyciu collection.updateOne metody i dodaj go do kolekcji.

    const filter = { _id: request.params._id };
    const payload = {
        $set: document
    };
    const options = {
        upsert: true
    };
    
    var response = await collection.updateOne(filter, payload, options);
    
    if (response.acknowledged) {
        console.log(`Documents upserted count:\t${response.matchedCount}`);
    }
    
  4. Użyj polecenia collection.findOne , aby uzyskać określony dokument z kolekcji.

    const filter = { _id: request.params.id };
    
    var document = await collection.findOne(filter, options);
    
    console.log(`Read document _id:\t${document._id}`);
    
  5. Wykonaj zapytanie o wiele dokumentów pasujących do filtru przy użyciu polecenia collection.find.

    var filter = {
        category: 'gear-surf-surfboards'
    };
    
    var documents = collection.find(filter);
    
    for await (const document of documents) {
        console.log(`Found document:\t${JSON.stringify(document)}`);
    }
    
  6. Po zakończeniu zamknij połączenie klienta bazy danych MongoDB.

    await client.close();
    
  1. Uzyskaj odwołanie do bazy danych według nazwy.

    const database: Db = client.db('<database-name>');
    
    console.log('Database pointer created');
    
  2. Uzyskaj referencję do swojej kolekcji.

    const collection: Collection<Product> = database.collection<Product>('<collection-name>');
    
    console.log('Collection pointer created');
    
  3. Zdefiniuj interfejs reprezentujący dokumenty produktu.

    interface Product {
        _id: string;
        category: string;
        name: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    
  4. Utwórz dokument przy użyciu collection.updateOne metody i dodaj go do kolekcji.

    var document: Product = {
        _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        category: 'gear-surf-surfboards',
        name: 'Yamba Surfboard',
        quantity: 12,
        price: 850.00,
        clearance: false
    };
    
    var query: Filter<Product> = {
        _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    };
    var payload: UpdateFilter<Product> = {
        $set: document
    };
    var options: UpdateOptions = {
        upsert: true
    };
    var response: UpdateResult<Product> = await collection.updateOne(query, payload, options);
    
    if (response.acknowledged) {
        console.log(`Documents upserted count:\t${response.matchedCount}`);
    }
    
  5. Użyj polecenia collection.findOne , aby uzyskać określony dokument z kolekcji.

    var query: Filter<Product> = {
        _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        category: 'gear-surf-surfboards'
    };
    
    var response: WithId<Product> | null = await collection.findOne(query);
    
    var read_item: Product = response as Product;
    
    console.log(`Read document _id:\t${read_item._id}`);
    
  6. Wykonaj zapytanie o wiele dokumentów pasujących do filtru przy użyciu polecenia collection.find.

    var query: Filter<Product> = {
        category: 'gear-surf-surfboards'
    };
    
    var response: FindCursor<WithId<Product>> = collection.find(query);
    
    for await (const document of response) {
        console.log(`Found document:\t${JSON.stringify(document)}`);
    }
    
  7. Po zakończeniu zamknij połączenie klienta bazy danych MongoDB.

    await client.close();