Condividi tramite


Guida introduttiva: Libreria client di Azure Cosmos DB for Apache Cassandra per Node.js

Inizia a utilizzare la libreria client di Azure Cosmos DB per Apache Cassandra su Node.js per archiviare, gestire ed eseguire query sui dati non strutturati. Seguire la procedura descritta in questa guida per creare un nuovo account, installare una libreria client Node.js, connettersi all'account, eseguire operazioni comuni ed eseguire query sui dati di esempio finali.

Documentazione di riferimento sull'API | Codice sorgente della libreria | Pacchetto (npm)

Prerequisiti

  • Una sottoscrizione di Azure

    • Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • Node.js 22 o versione successiva

Configurazione

Prima di tutto, configurare l'account e l'ambiente di sviluppo per questa guida. Questa sezione illustra il processo di creazione di un account, il recupero delle credenziali e la preparazione dell'ambiente di sviluppo.

Crea un account

Per iniziare, creare un'API per l'account Apache Cassandra. Dopo aver creato l'account, creare il keyspace e le risorse della tabella.

  1. Se non si ha già un gruppo di risorse di destinazione, usare il az group create comando per creare un nuovo gruppo di risorse nella sottoscrizione.

    az group create \
        --name "<resource-group-name>" \
        --location "<location>"
    
  2. Usare il az cosmosdb create comando per creare un nuovo account Azure Cosmos DB per Apache Cassandra con le impostazioni predefinite.

    az cosmosdb create \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --locations "regionName=<location>" \
        --capabilities "EnableCassandra"
    
  3. Creare un nuovo keyspace utilizzando az cosmosdb cassandra keyspace create denominato cosmicworks.

    az cosmosdb cassandra keyspace create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --name "cosmicworks"
    
  4. Creare un nuovo oggetto JSON per rappresentare lo schema usando un comando Bash a più righe. Usare quindi il az cosmosdb cassandra table create comando per creare una nuova tabella denominata products.

    schemaJson=$(cat <<EOF
    {
      "columns": [
        {
          "name": "id",
          "type": "text"
        },
        {
          "name": "name",
          "type": "text"
        },
        {
          "name": "category",
          "type": "text"
        },
        {
          "name": "quantity",
          "type": "int"
        },
        {
          "name": "price",
          "type": "decimal"
        },
        {
          "name": "clearance",
          "type": "boolean"
        }
      ],
      "partitionKeys": [
        {
          "name": "id"
        }
      ]
    }
    EOF
    )
    
    az cosmosdb cassandra table create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --keyspace-name "cosmicworks" \
        --name "product" \
        --schema "$schemaJson"
    

Ottenere le credenziali

Ottenere ora la password per la libreria client da usare per creare una connessione all'account creato di recente.

  1. Usare az cosmosdb show per ottenere il punto di contatto e il nome utente per l'account.

    az cosmosdb show \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --query "{username:name,contactPoint:documentEndpoint}"
    
  2. Registrare il valore delle proprietà contactPoint e username dall'output dei comandi precedenti. Questi valori delle proprietà sono il punto di contatto e il nome utente usati più avanti in questa guida per connettersi all'account con la libreria.

  3. Usare az cosmosdb keys list per ottenere le chiavi per l'account.

    az cosmosdb keys list \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --type "keys"
    
  4. Registrare il valore della primaryMasterKey proprietà dall'output dei comandi precedenti. Il valore di questa proprietà è la password usata più avanti in questa guida per connettersi all'account con la libreria.

Preparare l'ambiente di sviluppo

Configurare quindi l'ambiente di sviluppo con un nuovo progetto e la libreria client. Questo passaggio è l'ultimo prerequisito necessario prima di passare al resto di questa guida.

  1. Iniziare in una cartella vuota.

  2. Inizializzare un nuovo modulo.

    npm init es6 --yes
    
  3. Installare il cassandra-driver pacchetto da Node Package Manager (npm).

    npm install --save cassandra-driver
    
  4. Creare il file index.js .

  1. Iniziare in una directory vuota.

  2. Inizializzare un nuovo modulo.

    npm init es6 --yes
    
  3. Installare il typescript pacchetto da Node Package Manager (npm).

    npm install --save-dev typescript
    
  4. Installare il tsx pacchetto da npm.

    npm install --save-dev tsx
    
  5. Installare il cassandra-driver pacchetto da npm.

    npm install --save cassandra-driver
    
  6. Inizializzare il progetto TypeScript usando il compilatore (tsc).

    npx tsc --init --target es2017 --module es2022 --moduleResolution nodenext
    
  7. Creare il file index.ts .

Modello a oggetti

Descrizione
Client Rappresenta una connessione specifica a un cluster
Mapper Client Cassandra Query Language (CQL) usato per eseguire query

Esempi di codice

Autenticare il client

Per iniziare, autenticare il client usando le credenziali raccolte in precedenza in questa guida.

  1. Aprire il file index.js nell'ambiente di sviluppo integrato (IDE).

  2. Importare i tipi seguenti dal cassandra-driver modulo:

    • cassandra
    • cassandra.Client
    • cassandra.mapping.Mapper
    • cassandra.auth.PlainTextAuthProvider
    import cassandra from 'cassandra-driver';
    
    const { Client } = cassandra;
    const { Mapper } = cassandra.mapping;
    const { PlainTextAuthProvider } = cassandra.auth;
    
  3. Creare variabili costanti di tipo stringa per le credenziali raccolte in precedenza in questa guida. Assegna nomi alle variabili username, password, e contactPoint.

    const username = '<username>';
    const password = '<password>';
    const contactPoint = '<contact-point>';
    
  4. Creare un'altra variabile stringa per l'area in cui è stato creato l'account Azure Cosmos DB per Apache Cassandra. Assegnare alla variabile regionil nome .

    const region = '<azure-region>';
    
  5. Creare un nuovo PlainTextAuthProvider oggetto con le credenziali specificate nei passaggi precedenti.

    let authProvider = new PlainTextAuthProvider(
        username,
        password
    );
    
  6. Creare un Client oggetto usando le credenziali e le variabili di configurazione create nei passaggi precedenti.

    let client = new Client({
        contactPoints: [`${contactPoint}:10350`],
        authProvider: authProvider,
        localDataCenter: region,
        sslOptions: {
            secureProtocol: 'TLSv1_2_method'
        },
    });
    
  7. Connettersi in modo asincrono al cluster.

    await client.connect();
    
  8. Creare un nuovo mapper destinato al cosmicworks keyspace e alla tabella product. Assegnare un nome al mapper Product.

    const mapper = new Mapper(client, {
        models: {
            'Product': {
                tables: ['product'],
                keyspace: 'cosmicworks'
            }
        }
    });
    
  9. Genera un'istanza di mapper utilizzando la funzione forModel e il nome mapper Product.

    const productMapper = mapper.forModel('Product');
    
  1. Aprire il file index.ts nell'ambiente di sviluppo integrato (IDE).

  2. Importare i tipi seguenti dal cassandra-driver modulo:

    • cassandra.auth
    • cassandra.mapping
    • cassandra.types
    • cassandra.Client
    • cassandra.ClientOptions
    • cassandra.mapping.Mapper
    • cassandra.auth.PlainTextAuthProvider
    import { auth, mapping, types, Client, ClientOptions } from 'cassandra-driver';
    
    const { Mapper } = mapping;
    const { PlainTextAuthProvider } = auth;
    
  3. Creare variabili costanti di tipo stringa per le credenziali raccolte in precedenza in questa guida. Assegna nomi alle variabili username, password, e contactPoint.

    const username: string = '<username>';
    const password: string = '<password>';
    const contactPoint: string = '<contact-point>';
    
  4. Creare un'altra variabile stringa per l'area in cui è stato creato l'account Azure Cosmos DB per Apache Cassandra. Assegnare alla variabile regionil nome .

    const region: string = '<azure-region>';
    
  5. Creare un nuovo PlainTextAuthProvider oggetto con le credenziali specificate nei passaggi precedenti.

    let authProvider = new PlainTextAuthProvider(
        username,
        password
    );
    
  6. Creare un oggetto anonimo con opzioni che garantiscono l'uso del protocollo TLS (Transport Layer Security) 1.2.

    let sslOptions = {
        secureProtocol: 'TLSv1_2_method'
    };
    
  7. Creare un ClientOptions oggetto usando le credenziali e le variabili di configurazione create nei passaggi precedenti.

    let clientOptions: ClientOptions = {
        contactPoints: [`${contactPoint}:10350`],
        authProvider: authProvider,
        localDataCenter: region,
        sslOptions: sslOptions
    };
    
  8. Creare un Client oggetto usando la clientOptions variabile nel costruttore .

    let client = new Client(clientOptions);
    
  9. Connettersi in modo asincrono al cluster.

    await client.connect();
    
  10. Creare un nuovo mapper destinato al cosmicworks keyspace e alla tabella product. Assegnare un nome al mapper Product.

    const mapper = new Mapper( client, {
        models: {
            'Product': {
                tables: ['product'],
                keyspace: 'cosmicworks'
            }
        }
    });
    
  11. Genera un'istanza di mapper utilizzando la funzione forModel e il nome mapper Product.

    const productMapper = mapper.forModel('Product');
    

Avvertimento

La convalida completa di TLS (Transport Layer Security) è disabilitata in questa guida per semplificare l'autenticazione. Nelle distribuzioni di produzione, abilitare completamente la validazione.

Aggiornare o inserire i dati

Eseguire quindi l'inserimento o aggiornamento dei nuovi dati all'interno di una tabella. L'upserting garantisce che i dati vengano creati o sostituiti in modo appropriato a seconda che nella tabella esistano già gli stessi dati.

  1. Creare un nuovo oggetto in una variabile denominata product.

    const product = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        name: 'Yamba Surfboard',
        category: 'gear-surf-surfboards',
        quantity: 12,
        price: 850.00,
        clearance: false
    };
    
  2. Richiamare in modo asincrono la insert funzione passando la product variabile creata nel passaggio precedente.

    await productMapper.insert(product);
    
  1. Definire una nuova interfaccia denominata Product con i campi corrispondenti alla tabella creata in precedenza in questa guida.

    TIPO
    Id string
    Name string
    Category string
    Quantity int
    Price decimal
    Clearance bool
    interface Product {
        id: string;
        name: string;
        category: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    

    Suggerimento

    In Node.jsè possibile creare questo tipo in un altro file o crearlo alla fine del file esistente.

  2. Creare un nuovo oggetto di tipo Product. Archiviare l'oggetto in una variabile denominata product.

    const product: Product = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        name: 'Yamba Surfboard',
        category: 'gear-surf-surfboards',
        quantity: 12,
        price: 850.00,
        clearance: false
    };
    
  3. Richiamare in modo asincrono la insert funzione passando la product variabile creata nel passaggio precedente.

    await productMapper.insert(product);
    

Leggere dati

Leggere quindi i dati precedentemente inseriti nella tabella.

  1. Creare un oggetto anonimo denominato filter. In questo oggetto includere una proprietà denominata id con lo stesso valore del prodotto creato in precedenza in questa guida.

    const filter = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    };
    
  2. Richiamare la funzione get del mapper passando la variabilefilter. Archiviare il risultato in una variabile denominata matchedProduct.

    let matchedProduct = await productMapper.get(filter);
    
  1. Creare un oggetto anonimo denominato filter. In questo oggetto includere una proprietà denominata id con lo stesso valore del prodotto creato in precedenza in questa guida.

    const filter = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    };
    
  2. Richiamare la funzione get del mapper passando la variabilefilter. Archiviare il risultato in una variabile denominata matchedProduct di tipo Product.

    let matchedProduct: Product = await productMapper.get(filter);
    

Dati di query

Usare infine una query per trovare tutti i dati corrispondenti a un filtro specifico nella tabella.

  1. Creare una nuova variabile stringa denominata query con una query CQL che corrisponde agli elementi con lo stesso category campo.

    const query = `
    SELECT
        *
    FROM
        cosmicworks.product
    WHERE
        category = :category
    ALLOW FILTERING
    `;
    
  2. Creare un oggetto anonimo denominato params. In questo oggetto includere una proprietà denominata category con lo stesso valore del prodotto creato in precedenza in questa guida.

    const params = {
        category: 'gear-surf-surfboards'
    };
    
  3. Richiamare in modo asincrono la funzione execute passando sia la variabile query che la variabile params come argomenti. Archiviare la proprietà del rows risultato come variabile denominata matchedProducts.

    let { rows: matchedProducts } = await client.execute(query, params);
    
  4. Iterare sui risultati della query richiamando il metodo foreach sull'array di prodotti.

    matchedProducts.forEach(product => {
        // Do something here with each result
    });
    
  1. Creare una nuova variabile stringa denominata query con una query CQL che corrisponde agli elementi con lo stesso category campo.

    const query: string = `
    SELECT
        *
    FROM
        cosmicworks.product
    WHERE
        category = :category
    ALLOW FILTERING
    `;
    
  2. Creare un oggetto anonimo denominato params. In questo oggetto includere una proprietà denominata category con lo stesso valore del prodotto creato in precedenza in questa guida.

    const params = {
        category: 'gear-surf-surfboards'
    };
    
  3. Richiamare in modo asincrono la funzione execute passando sia la variabile query che la variabile params come argomenti. Archiviare il risultato in una variabile denominata result di tipo types.ResultSet.

    let result: types.ResultSet = await client.execute(query, params);
    
  4. Archiviare la proprietà del rows risultato come variabile denominata matchedProducts di tipo Product[].

    let matchedProducts: Product[] = result.rows;
    
  5. Iterare sui risultati della query richiamando il metodo foreach sull'array di prodotti.

    matchedProducts.forEach((product: Product) => {
        // Do something here with each result
    });
    

Eseguire il codice

Eseguire l'applicazione appena creata usando un terminale nella directory dell'applicazione.

node index.js
npx tsx index.ts

Pulire le risorse

Quando l'account non è più necessario, rimuovere l'account dalla sottoscrizione di Azure eliminando la risorsa.

az cosmosdb delete \
    --resource-group "<resource-group-name>" \
    --name "<account-name>"

Passo successivo