Condividi tramite


Creare un'app console Node.js con Azure Cosmos DB per MongoDB vCore

Questa guida consente di creare un'applicazione console Node.js per connettersi a un cluster vCore di Azure Cosmos DB per MongoDB. Si prepara l'ambiente di sviluppo, si usa il @azure/identity pacchetto di Azure SDK per JavaScript per l'autenticazione e si eseguono operazioni comuni sui documenti nel database.

Prerequisiti

  • Un cluster esistente di Azure Cosmos DB per MongoDB (vCore).
  • Autenticazione di Microsoft Entra configurata per il cluster con il ruolo dbOwner assegnato alla tua identità.

  • Versione più recente del supporto a lungo termine (LTS) di Node

Configurare l'applicazione console

Creare quindi un nuovo progetto di applicazione console e importare le librerie necessarie per l'autenticazione nel cluster.

  1. Creare una nuova directory per il progetto e inizializzarla con npm init.

    mkdir cosmos-mongodb-app
    cd cosmos-mongodb-app
    npm init -y
    
  2. Configurare TypeScript nel progetto.

    npm install typescript ts-node @types/node --save-dev
    npx tsc --init
    
  3. Creare il file TypeScript app.ts principale per l'applicazione.

    touch app.ts
    
  4. Installare la @azure/identity libreria per l'autenticazione.

    npm install @azure/identity
    
  5. Installare la libreria mongodb.

    npm install mongodb
    

Connettersi al cluster

Ora, utilizza la libreria Azure.Identity per ottenere un TokenCredential da utilizzare per connetterti al cluster. Il driver Ufficiale di MongoDB ha un'interfaccia speciale che deve essere implementata per ottenere i token da Microsoft Entra per l'uso durante la connessione al cluster.

  1. Importare i moduli necessari nella parte superiore del file JavaScript.

    import { MongoClient } from 'mongodb';
    import { DefaultAzureCredential } from '@azure/identity';
    
  2. Creare una funzione di callback del token che ottiene i token dall'istanza TokenCredential quando necessario.

    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. Imposta la variabile del nome del tuo cluster per connetterti al cluster Azure Cosmos DB per MongoDB vCore.

    const clusterName = '<azure-cosmos-db-mongodb-vcore-cluster-name>';
    
  4. Crea un'istanza di DefaultAzureCredential.

    const credential = new DefaultAzureCredential();
    
  5. Creare un client MongoDB configurato con l'autenticazione OIDC (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. Importare i moduli necessari nella parte superiore del file TypeScript.

    import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';
    import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';
    
  2. Creare una funzione di callback del token che ottiene i token dall'istanza TokenCredential quando necessario.

    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. Imposta la variabile del nome del tuo cluster per connetterti al cluster Azure Cosmos DB per MongoDB vCore.

    const clusterName: string = '<azure-cosmos-db-mongodb-vcore-cluster-name>';
    
  4. Crea un'istanza di DefaultAzureCredential.

    const credential: TokenCredential = new DefaultAzureCredential();
    
  5. Creare un client MongoDB configurato con l'autenticazione OIDC (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');
    

Eseguire operazioni comuni

Infine, usare la libreria ufficiale per eseguire attività comuni con database, raccolte e documenti. In questo caso si usano le stesse classi e metodi usati per interagire con MongoDB o DocumentDB per gestire le raccolte e gli elementi.

  1. Ottieni un riferimento al tuo database per nome.

    const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks';
    
    console.log('Database pointer created');
    
  2. Ottieni un riferimento alla tua raccolta.

    const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products';
    
    console.log('Collection pointer created');
    
  3. Crea un documento usando collection.updateOne e upsertalo nella raccolta.

    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. Utilizzare collection.findOne per ottenere un documento specifico dalla raccolta.

    const filter = { _id: request.params.id };
    
    var document = await collection.findOne(filter, options);
    
    console.log(`Read document _id:\t${document._id}`);
    
  5. Eseguire una query per più documenti corrispondenti a un filtro usando 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. Al termine, chiudere la connessione client MongoDB.

    await client.close();
    
  1. Ottieni un riferimento al tuo database per nome.

    const database: Db = client.db('<database-name>');
    
    console.log('Database pointer created');
    
  2. Ottieni un riferimento alla tua raccolta.

    const collection: Collection<Product> = database.collection<Product>('<collection-name>');
    
    console.log('Collection pointer created');
    
  3. Definire un'interfaccia per rappresentare i documenti del prodotto.

    interface Product {
        _id: string;
        category: string;
        name: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    
  4. Crea un documento usando collection.updateOne e upsertalo nella raccolta.

    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. Utilizzare collection.findOne per ottenere un documento specifico dalla raccolta.

    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. Eseguire una query per più documenti corrispondenti a un filtro usando 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. Al termine, chiudere la connessione client MongoDB.

    await client.close();