Compartir a través de


Compilación de una aplicación de consola de Node.js con Azure DocumentDB

Esta guía le ayuda a crear una aplicación de consola de Node.js para conectarse a un clúster de Azure DocumentDB. Tú preparas tu entorno de desarrollo, usa el paquete @azure/identity del SDK de Azure para JavaScript para autenticarse y realizar operaciones comunes en documentos de la base de datos.

Prerrequisitos

  • Una suscripción de Azure

  • Un clúster de Azure DocumentDB existente

  • La autenticación de Microsoft Entra está configurada para el clúster con el rol root concedido a la identidad.

  • Versión más reciente de soporte técnico a largo plazo (LTS) de Node

Configuración de la aplicación de consola

A continuación, cree un nuevo proyecto de aplicación de consola e importe las bibliotecas necesarias para autenticarse en el clúster.

  1. Cree un nuevo directorio para el proyecto e inicialícelo con npm init.

    mkdir mongodb-app
    cd mongodb-app
    npm init -y
    
  2. Configurar TypeScript en el proyecto.

    npm install typescript ts-node @types/node --save-dev
    npx tsc --init
    
  3. Cree el archivo app.ts TypeScript principal para la aplicación.

    touch app.ts
    
  4. Instale la @azure/identity biblioteca para autenticación.

    npm install @azure/identity
    
  5. Instale la biblioteca mongodb.

    npm install mongodb
    

Conectarse al clúster

Ahora, utilice la Azure.Identity biblioteca para obtener un TokenCredential que usará para conectarse a su clúster. El controlador oficial de MongoDB tiene una interfaz especial que se debe implementar para obtener tokens de Microsoft Entra para su uso al conectarse al clúster.

  1. Importe los módulos necesarios en la parte superior del archivo JavaScript.

    import { MongoClient } from 'mongodb';
    import { DefaultAzureCredential } from '@azure/identity';
    
  2. Cree una función de devolución de llamada de token que obtenga tokens de la instancia TokenCredential cuando sea necesario.

    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. Establezca la variable de nombre del clúster para conectarse al clúster de Azure DocumentDB.

    const clusterName = '<azure-documentdb-cluster-name>';
    
  4. Cree una instancia de DefaultAzureCredential.

    const credential = new DefaultAzureCredential();
    
  5. Cree un cliente de MongoDB configurado con la autenticación de 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. Importe los módulos necesarios en la parte superior del archivo TypeScript.

    import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';
    import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';
    
  2. Cree una función de devolución de llamada de token que obtenga tokens de la instancia TokenCredential cuando sea necesario.

    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. Establezca la variable de nombre del clúster para conectarse al clúster de Azure DocumentDB.

    const clusterName: string = '<azure-documentdb-cluster-name>';
    
  4. Cree una instancia de DefaultAzureCredential.

    const credential: TokenCredential = new DefaultAzureCredential();
    
  5. Cree un cliente de MongoDB configurado con la autenticación de 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');
    

Realización de operaciones comunes

Por último, use la biblioteca oficial para realizar tareas comunes con bases de datos, colecciones y documentos. Aquí, usará las mismas clases y métodos que usaría para interactuar con MongoDB o DocumentDB para administrar las colecciones y los elementos.

  1. Obtenga una referencia a su base de datos por nombre.

    const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks';
    
    console.log('Database pointer created');
    
  2. Obtenga una referencia a tu colección.

    const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products';
    
    console.log('Collection pointer created');
    
  3. Cree un documento con collection.updateOne y reertelo en la colección.

    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. Use collection.findOne para obtener un documento específico de la colección.

    const filter = { _id: request.params.id };
    
    var document = await collection.findOne(filter, options);
    
    console.log(`Read document _id:\t${document._id}`);
    
  5. Consulte varios documentos que coincidan con un filtro mediante 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. Cierre la conexión de cliente de MongoDB cuando haya terminado.

    await client.close();
    
  1. Obtenga una referencia a su base de datos por nombre.

    const database: Db = client.db('<database-name>');
    
    console.log('Database pointer created');
    
  2. Obtenga una referencia a tu colección.

    const collection: Collection<Product> = database.collection<Product>('<collection-name>');
    
    console.log('Collection pointer created');
    
  3. Defina una interfaz para representar los documentos del producto.

    interface Product {
        _id: string;
        category: string;
        name: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    
  4. Cree un documento con collection.updateOne y reertelo en la colección.

    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. Use collection.findOne para obtener un documento específico de la colección.

    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. Consulte varios documentos que coincidan con un filtro mediante 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. Cierre la conexión de cliente de MongoDB cuando haya terminado.

    await client.close();