Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
- Si no tiene ninguna suscripción a Azure, cree una cuenta gratuita
Un clúster de Azure DocumentDB existente
- Si no tiene un clúster, cree un nuevo clúster.
Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte Introducción a Azure Cloud Shell.
Si prefieres ejecutar comandos de referencia CLI localmente, instala la CLI de Azure. Si estás utilizando Windows o macOS, considera ejecutar Azure CLI en un contenedor Docker. Para obtener más información, consulte Cómo ejecutar el Azure CLI en un contenedor de Docker.
Si estás utilizando una instalación local, inicia sesión en Azure CLI utilizando el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Autenticación en Azure mediante la CLI de Azure.
En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para obtener más información sobre las extensiones, consulte Uso y administración de extensiones con la CLI de Azure.
Ejecute az version para ver la versión y las bibliotecas dependientes que están instaladas. Para actualizar a la versión más reciente, ejecute az upgrade.
La autenticación de Microsoft Entra está configurada para el clúster con el rol
rootconcedido a la identidad.- Para habilitar la autenticación de Microsoft Entra, revise la guía de configuración.
Versión más reciente de soporte técnico a largo plazo (LTS) de Node
- Versión más reciente de TypeScript.
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.
Cree un nuevo directorio para el proyecto e inicialícelo con
npm init.mkdir mongodb-app cd mongodb-app npm init -yConfigurar TypeScript en el proyecto.
npm install typescript ts-node @types/node --save-dev npx tsc --initCree el archivo app.ts TypeScript principal para la aplicación.
touch app.tsInstale la
@azure/identitybiblioteca para autenticación.npm install @azure/identityInstale 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.
Importe los módulos necesarios en la parte superior del archivo JavaScript.
import { MongoClient } from 'mongodb'; import { DefaultAzureCredential } from '@azure/identity';Cree una función de devolución de llamada de token que obtenga tokens de la instancia
TokenCredentialcuando 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), }; };Establezca la variable de nombre del clúster para conectarse al clúster de Azure DocumentDB.
const clusterName = '<azure-documentdb-cluster-name>';Cree una instancia de
DefaultAzureCredential.const credential = new DefaultAzureCredential();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');
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';Cree una función de devolución de llamada de token que obtenga tokens de la instancia
TokenCredentialcuando 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) }; };Establezca la variable de nombre del clúster para conectarse al clúster de Azure DocumentDB.
const clusterName: string = '<azure-documentdb-cluster-name>';Cree una instancia de
DefaultAzureCredential.const credential: TokenCredential = new DefaultAzureCredential();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.
Obtenga una referencia a su base de datos por nombre.
const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks'; console.log('Database pointer created');Obtenga una referencia a tu colección.
const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products'; console.log('Collection pointer created');Cree un documento con
collection.updateOney 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}`); }Use
collection.findOnepara 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}`);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)}`); }Cierre la conexión de cliente de MongoDB cuando haya terminado.
await client.close();
Obtenga una referencia a su base de datos por nombre.
const database: Db = client.db('<database-name>'); console.log('Database pointer created');Obtenga una referencia a tu colección.
const collection: Collection<Product> = database.collection<Product>('<collection-name>'); console.log('Collection pointer created');Defina una interfaz para representar los documentos del producto.
interface Product { _id: string; category: string; name: string; quantity: number; price: number; clearance: boolean; }Cree un documento con
collection.updateOney 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}`); }Use
collection.findOnepara 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}`);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)}`); }Cierre la conexión de cliente de MongoDB cuando haya terminado.
await client.close();