Delen via


Een Node.js-console-app bouwen met Azure DocumentDB

Deze handleiding helpt u bij het bouwen van een Node.js-consoletoepassing om verbinding te maken met een Azure DocumentDB-cluster. U bereidt uw ontwikkelomgeving voor, gebruikt het @azure/identity pakket van de Azure SDK voor JavaScript om te verifiëren en algemene bewerkingen uit te voeren op documenten in de database.

Vereiste voorwaarden

  • Een Azure-abonnement

  • Een bestaand Azure DocumentDB-cluster

  • Microsoft Entra-verificatie die is geconfigureerd voor het cluster met uw door uw identiteit verleende root rol.

  • Nieuwste LTS-versie (Long-Term Support) van Node

Uw consoletoepassing configureren

Maak vervolgens een nieuw consoletoepassingsproject en importeer de benodigde bibliotheken om te verifiëren bij uw cluster.

  1. Maak een nieuwe map voor uw project en initialiseer deze met npm init.

    mkdir mongodb-app
    cd mongodb-app
    npm init -y
    
  2. Stel TypeScript in uw project in.

    npm install typescript ts-node @types/node --save-dev
    npx tsc --init
    
  3. Maak het hoofdbestand app.ts TypeScript voor uw toepassing.

    touch app.ts
    
  4. Installeer de @azure/identity bibliotheek voor verificatie.

    npm install @azure/identity
    
  5. Installeer de mongodb bibliotheek.

    npm install mongodb
    

Verbinding maken met het cluster

Gebruik nu de Azure.Identity bibliotheek om een TokenCredential te krijgen, die u kunt gebruiken om verbinding te maken met uw cluster. Het officiële MongoDB-stuurprogramma heeft een speciale interface die moet worden geïmplementeerd om tokens van Microsoft Entra te verkrijgen voor gebruik bij het maken van verbinding met het cluster.

  1. Importeer de benodigde modules boven aan uw JavaScript-bestand.

    import { MongoClient } from 'mongodb';
    import { DefaultAzureCredential } from '@azure/identity';
    
  2. Maak een callback-functie aan die tokens verkrijgt van het TokenCredential exemplaar wanneer dat nodig is.

    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. Stel de clusternaamvariabele in om verbinding te maken met uw Azure DocumentDB-cluster.

    const clusterName = '<azure-documentdb-cluster-name>';
    
  4. Maak een exemplaar van DefaultAzureCredential.

    const credential = new DefaultAzureCredential();
    
  5. Maak een MongoDB-client die is geconfigureerd met OIDC-verificatie (OpenID Connect).

    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. Importeer de benodigde modules boven aan het TypeScript-bestand.

    import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';
    import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';
    
  2. Maak een callback-functie aan die tokens verkrijgt van het TokenCredential exemplaar wanneer dat nodig is.

    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. Stel de clusternaamvariabele in om verbinding te maken met uw Azure DocumentDB-cluster.

    const clusterName: string = '<azure-documentdb-cluster-name>';
    
  4. Maak een exemplaar van DefaultAzureCredential.

    const credential: TokenCredential = new DefaultAzureCredential();
    
  5. Maak een MongoDB-client die is geconfigureerd met OIDC-verificatie (OpenID Connect).

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

Algemene bewerkingen uitvoeren

Gebruik ten slotte de officiële bibliotheek om algemene taken uit te voeren met databases, verzamelingen en documenten. Hier gebruikt u dezelfde klassen en methoden die u zou gebruiken om te communiceren met MongoDB of DocumentDB om uw verzamelingen en items te beheren.

  1. Verkrijg een verwijzing naar uw database via de naam.

    const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks';
    
    console.log('Database pointer created');
    
  2. Haal een verwijzing naar uw verzameling op.

    const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products';
    
    console.log('Collection pointer created');
    
  3. Maak een document met behulp van collection.updateOne en voer een upsert-bewerking uit om het in de verzameling op te nemen.

    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. Hiermee collection.findOne haalt u een specifiek document op uit de verzameling.

    const filter = { _id: request.params.id };
    
    var document = await collection.findOne(filter, options);
    
    console.log(`Read document _id:\t${document._id}`);
    
  5. Query's uitvoeren op meerdere documenten die overeenkomen met een filter met behulp van 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. Sluit de MongoDB-clientverbinding wanneer u klaar bent.

    await client.close();
    
  1. Verkrijg een verwijzing naar uw database via de naam.

    const database: Db = client.db('<database-name>');
    
    console.log('Database pointer created');
    
  2. Haal een verwijzing naar uw verzameling op.

    const collection: Collection<Product> = database.collection<Product>('<collection-name>');
    
    console.log('Collection pointer created');
    
  3. Definieer een interface die uw productdocumenten vertegenwoordigt.

    interface Product {
        _id: string;
        category: string;
        name: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    
  4. Maak een document met behulp van collection.updateOne en voer een upsert-bewerking uit om het in de verzameling op te nemen.

    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. Hiermee collection.findOne haalt u een specifiek document op uit de verzameling.

    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. Query's uitvoeren op meerdere documenten die overeenkomen met een filter met behulp van 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. Sluit de MongoDB-clientverbinding wanneer u klaar bent.

    await client.close();