Partager via


Créer une application console Node.js avec Azure DocumentDB

Ce guide vous aide à créer une application console Node.js pour vous connecter à un cluster Azure DocumentDB. Vous préparez votre environnement de développement, utilisez le @azure/identity package du Kit de développement logiciel (SDK) Azure pour JavaScript pour l’authentification et effectuez des opérations courantes sur les documents de la base de données.

Prerequisites

  • Un abonnement Azure

  • Un cluster Azure DocumentDB existant

    • Si vous n’avez pas de cluster, créez un cluster

Configurer votre application console

Ensuite, créez un projet d’application console et importez les bibliothèques nécessaires pour vous authentifier auprès de votre cluster.

  1. Créez un répertoire pour votre projet et initialisez-le avec npm init.

    mkdir mongodb-app
    cd mongodb-app
    npm init -y
    
  2. Configurez TypeScript dans votre projet.

    npm install typescript ts-node @types/node --save-dev
    npx tsc --init
    
  3. Créez le fichier TypeScript principal app.ts pour votre application.

    touch app.ts
    
  4. Installez la bibliothèque pour l’authentification @azure/identity .

    npm install @azure/identity
    
  5. Installez la bibliothèque mongodb.

    npm install mongodb
    

Se connecter au cluster

À présent, utilisez la bibliothèque Azure.Identity pour obtenir un TokenCredential à utiliser afin de vous connecter à votre cluster. Le pilote MongoDB officiel a une interface spéciale qui doit être implémentée pour obtenir des jetons de Microsoft Entra à utiliser lors de la connexion au cluster.

  1. Importez les modules nécessaires en haut de votre fichier JavaScript.

    import { MongoClient } from 'mongodb';
    import { DefaultAzureCredential } from '@azure/identity';
    
  2. Créez une fonction de rappel de jeton qui obtient des jetons de l’instance TokenCredential si nécessaire.

    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. Définissez votre variable de nom de cluster pour vous connecter à votre cluster Azure DocumentDB.

    const clusterName = '<azure-documentdb-cluster-name>';
    
  4. Créez une instance de DefaultAzureCredential.

    const credential = new DefaultAzureCredential();
    
  5. Créez un client MongoDB configuré avec l’authentification 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. Importez les modules nécessaires en haut de votre fichier TypeScript.

    import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';
    import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';
    
  2. Créez une fonction de rappel de jeton qui obtient des jetons de l’instance TokenCredential si nécessaire.

    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. Définissez votre variable de nom de cluster pour vous connecter à votre cluster Azure DocumentDB.

    const clusterName: string = '<azure-documentdb-cluster-name>';
    
  4. Créez une instance de DefaultAzureCredential.

    const credential: TokenCredential = new DefaultAzureCredential();
    
  5. Créez un client MongoDB configuré avec l’authentification 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');
    

Effectuer des opérations courantes

Enfin, utilisez la bibliothèque officielle pour effectuer des tâches courantes avec des bases de données, des collections et des documents. Ici, vous utilisez les mêmes classes et méthodes que celles que vous utiliseriez pour interagir avec MongoDB ou DocumentDB pour gérer vos collections et éléments.

  1. Obtenez une référence à votre base de données par nom.

    const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks';
    
    console.log('Database pointer created');
    
  2. Obtenez une référence à votre collection.

    const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products';
    
    console.log('Collection pointer created');
    
  3. Créez un document en utilisant collection.updateOne et upsert dans la collection.

    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. Permet collection.findOne d’obtenir un document spécifique de la collection.

    const filter = { _id: request.params.id };
    
    var document = await collection.findOne(filter, options);
    
    console.log(`Read document _id:\t${document._id}`);
    
  5. Rechercher plusieurs documents correspondant à un filtre en utilisant 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. Fermez la connexion du client MongoDB lorsque vous avez terminé.

    await client.close();
    
  1. Obtenez une référence à votre base de données par nom.

    const database: Db = client.db('<database-name>');
    
    console.log('Database pointer created');
    
  2. Obtenez une référence à votre collection.

    const collection: Collection<Product> = database.collection<Product>('<collection-name>');
    
    console.log('Collection pointer created');
    
  3. Définissez une interface pour représenter vos documents de produit.

    interface Product {
        _id: string;
        category: string;
        name: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    
  4. Créez un document en utilisant collection.updateOne et upsert dans la collection.

    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. Permet collection.findOne d’obtenir un document spécifique de la collection.

    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. Rechercher plusieurs documents correspondant à un filtre en utilisant 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. Fermez la connexion du client MongoDB lorsque vous avez terminé.

    await client.close();