Partilhar via


Constrói uma aplicação Node.js consola com o Azure DocumentDB

Este guia ajuda-te a construir uma aplicação Node.js consola para se ligar a um cluster Azure DocumentDB. Você prepara seu ambiente de desenvolvimento, usa o @azure/identity pacote do SDK do Azure para JavaScript para autenticar e executa operações comuns em documentos no banco de dados.

Pré-requisitos

  • Uma assinatura do Azure

    • Se você não tiver uma assinatura do Azure, crie uma conta gratuita
  • Um cluster do Azure DocumentDB existente

  • Autenticação do Microsoft Entra configurada para o cluster com o papel atribuído à sua identidade root.

  • Última versão de suporte de longo prazo (LTS) do Node

Configurar seu aplicativo de console

Em seguida, crie um novo projeto de aplicativo de console e importe as bibliotecas necessárias para autenticar no cluster.

  1. Crie um novo diretório para seu projeto e inicialize-o com npm init.

    mkdir mongodb-app
    cd mongodb-app
    npm init -y
    
  2. Configure o TypeScript em seu projeto.

    npm install typescript ts-node @types/node --save-dev
    npx tsc --init
    
  3. Crie o arquivo app.ts TypeScript principal para seu aplicativo.

    touch app.ts
    
  4. Instale a @azure/identity biblioteca para autenticação.

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

    npm install mongodb
    

Ligar ao cluster

Agora, use a Azure.Identity biblioteca para obter um TokenCredential para usar para se conectar ao seu cluster. O driver oficial do MongoDB tem uma interface especial que deve ser implementada para obter tokens do Microsoft Entra para uso ao se conectar ao cluster.

  1. Importe os módulos necessários na parte superior do seu arquivo JavaScript.

    import { MongoClient } from 'mongodb';
    import { DefaultAzureCredential } from '@azure/identity';
    
  2. Crie uma função de retorno de chamada de token que obtém tokens da TokenCredential instância quando necessário.

    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. Defina a variável do nome do seu cluster para se ligar ao seu cluster Azure DocumentDB.

    const clusterName = '<azure-documentdb-cluster-name>';
    
  4. Crie uma instância de DefaultAzureCredential.

    const credential = new DefaultAzureCredential();
    
  5. Crie um cliente MongoDB configurado com autenticação 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 os módulos necessários na parte superior do arquivo TypeScript.

    import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';
    import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';
    
  2. Crie uma função de retorno de chamada de token que obtém tokens da TokenCredential instância quando necessário.

    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. Defina a variável do nome do seu cluster para se ligar ao seu cluster Azure DocumentDB.

    const clusterName: string = '<azure-documentdb-cluster-name>';
    
  4. Crie uma instância de DefaultAzureCredential.

    const credential: TokenCredential = new DefaultAzureCredential();
    
  5. Crie um cliente MongoDB configurado com autenticação 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');
    

Executar operações comuns

Finalmente, use a biblioteca oficial para executar tarefas comuns com bancos de dados, coleções e documentos. Aqui, você usa as mesmas classes e métodos que usaria para interagir com o MongoDB ou o Banco de Dados de Documentos para gerenciar suas coleções e itens.

  1. Obtenha uma referência ao seu banco de dados através do nome.

    const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks';
    
    console.log('Database pointer created');
    
  2. Obtenha uma referência à sua coleção de dados.

    const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products';
    
    console.log('Collection pointer created');
    
  3. Crie um documento usando collection.updateOne e atualize-o para a coleção.

    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 obter um documento específico da coleção.

    const filter = { _id: request.params.id };
    
    var document = await collection.findOne(filter, options);
    
    console.log(`Read document _id:\t${document._id}`);
    
  5. Consulta de vários documentos correspondentes a um 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. Feche a conexão do cliente MongoDB quando terminar.

    await client.close();
    
  1. Obtenha uma referência ao seu banco de dados através do nome.

    const database: Db = client.db('<database-name>');
    
    console.log('Database pointer created');
    
  2. Obtenha uma referência à sua coleção de dados.

    const collection: Collection<Product> = database.collection<Product>('<collection-name>');
    
    console.log('Collection pointer created');
    
  3. Defina uma interface para representar os documentos do produto.

    interface Product {
        _id: string;
        category: string;
        name: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    
  4. Crie um documento usando collection.updateOne e atualize-o para a coleção.

    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 obter um documento específico da coleção.

    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. Consulta de vários documentos correspondentes a um 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. Feche a conexão do cliente MongoDB quando terminar.

    await client.close();