Поделиться через


Краткое руководство: клиентская библиотека для Azure Cosmos DB для Apache Cassandra Node.js

Начните работу с клиентской библиотекой Apache Cassandra для Azure Cosmos DB Node.js для сохранения, управления и выполнения запросов к неструктурированным данным. Выполните действия, описанные в этом руководстве, чтобы создать новую учетную запись, установить клиентскую библиотеку Node.js, подключиться к учетной записи, выполнить типичные операции и запросить результаты выборки данных.

Справочная документация по API | Исходный код библиотеки | Пакет (npm).

Предпосылки

  • Последняя версия Azure CLI в Azure Cloud Shell.

    • Если вы предпочитаете локально запускать справочные команды CLI, войдите в Azure CLI с помощью az login команды.
  • Node.js 22 или более поздней версии

Настройка

Сначала настройте учетную запись и среду разработки для этого руководства. В этом разделе описан процесс создания учетной записи, получения учетных данных и подготовки среды разработки.

Создать аккаунт

Сначала создайте API для учетной записи Apache Cassandra. После создания учетной записи создайте пространство ключей и ресурсы для таблицы.

  1. Если у вас еще нет целевой группы ресурсов, используйте az group create команду для создания новой группы ресурсов в подписке.

    az group create \
        --name "<resource-group-name>" \
        --location "<location>"
    
  2. az cosmosdb create Используйте команду для создания новой учетной записи Azure Cosmos DB для Apache Cassandra с параметрами по умолчанию.

    az cosmosdb create \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --locations "regionName=<location>" \
        --capabilities "EnableCassandra"
    
  3. Создайте новое пространство ключей с именем cosmicworks с помощью az cosmosdb cassandra keyspace create.

    az cosmosdb cassandra keyspace create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --name "cosmicworks"
    
  4. Создайте новый объект JSON для представления схемы с помощью команды Bash с несколькими строками. Затем используйте az cosmosdb cassandra table create команду, чтобы создать новую таблицу с именем 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"
    

Получение учетных данных

Теперь получите пароль для клиентской библиотеки для создания подключения к недавно созданной учетной записи.

  1. Используйте az cosmosdb show, чтобы получить точку контакта и имя пользователя для учетной записи.

    az cosmosdb show \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --query "{username:name,contactPoint:documentEndpoint}"
    
  2. Запишите значение свойств contactPoint и username из вывода предыдущих команд. Эти свойства представляют собой контактную точку и имя пользователя , которое вы используете далее в этом руководстве для подключения к учетной записи с библиотекой.

  3. Используйте az cosmosdb keys list для получения ключей для учетной записи.

    az cosmosdb keys list \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --type "keys"
    
  4. Запишите значение primaryMasterKey свойства из выходных данных предыдущих команд. Это значение свойства — это пароль , который вы используете далее в этом руководстве для подключения к учетной записи с библиотекой.

Подготовка среды разработки

Затем настройте среду разработки с новым проектом и клиентской библиотекой. Этот шаг является последним обязательным предварительным условием, прежде чем перейти к остальной части этого руководства.

  1. Запустите пустую папку.

  2. Инициализация нового модуля.

    npm init es6 --yes
    
  3. Установите пакет cassandra-driver с помощью менеджера пакетов Node (npm).

    npm install --save cassandra-driver
    
  4. Создайте файл index.js .

  1. Начните в пустом каталоге.

  2. Инициализация нового модуля.

    npm init es6 --yes
    
  3. Установите пакет typescript с помощью менеджера пакетов Node (npm).

    npm install --save-dev typescript
    
  4. Установите пакет tsx из npm.

    npm install --save-dev tsx
    
  5. Установите пакет cassandra-driver из npm.

    npm install --save cassandra-driver
    
  6. Инициализация проекта TypeScript с помощью компилятора (tsc).

    npx tsc --init --target es2017 --module es2022 --moduleResolution nodenext
    
  7. Создайте файл index.ts .

Объектная модель

Описание
Client Представляет определенное подключение к кластеру
Mapper Клиент языка запросов Cassandra (CQL), используемый для выполнения запросов

Примеры кода

Проверка подлинности клиента

Начните с проверки подлинности клиента с помощью учетных данных, собранных ранее в этом руководстве.

  1. Откройте файлindex.js в интегрированной среде разработки (IDE).

  2. Импортируйте следующие типы из cassandra-driver модуля:

    • 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. Создайте строковые постоянные переменные для учетных данных, собранных ранее в этом руководстве. Присвойте переменным usernamepasswordи contactPoint.

    const username = '<username>';
    const password = '<password>';
    const contactPoint = '<contact-point>';
    
  4. Создайте другую строковую переменную для региона, в котором вы создали учетную запись Azure Cosmos DB для Apache Cassandra. Присвойте этой переменной regionимя.

    const region = '<azure-region>';
    
  5. Создайте объект PlainTextAuthProvider с учетными данными, указанными на предыдущих шагах.

    let authProvider = new PlainTextAuthProvider(
        username,
        password
    );
    
  6. Client Создайте объект с помощью учетных данных и переменных конфигурации, созданных на предыдущих шагах.

    let client = new Client({
        contactPoints: [`${contactPoint}:10350`],
        authProvider: authProvider,
        localDataCenter: region,
        sslOptions: {
            secureProtocol: 'TLSv1_2_method'
        },
    });
    
  7. Асинхронное подключение к кластеру.

    await client.connect();
    
  8. Создайте новый mapper, ориентированный на пространство ключей cosmicworks и таблицу product. Назовите mapper Product.

    const mapper = new Mapper(client, {
        models: {
            'Product': {
                tables: ['product'],
                keyspace: 'cosmicworks'
            }
        }
    });
    
  9. Создайте экземпляр маппера с использованием функции forModel и имени маппера Product.

    const productMapper = mapper.forModel('Product');
    
  1. Откройте файл index.ts в интегрированной среде разработки (IDE).

  2. Импортируйте следующие типы из cassandra-driver модуля:

    • 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. Создайте строковые постоянные переменные для учетных данных, собранных ранее в этом руководстве. Присвойте переменным usernamepasswordи contactPoint.

    const username: string = '<username>';
    const password: string = '<password>';
    const contactPoint: string = '<contact-point>';
    
  4. Создайте другую строковую переменную для региона, в котором вы создали учетную запись Azure Cosmos DB для Apache Cassandra. Присвойте этой переменной regionимя.

    const region: string = '<azure-region>';
    
  5. Создайте объект PlainTextAuthProvider с учетными данными, указанными на предыдущих шагах.

    let authProvider = new PlainTextAuthProvider(
        username,
        password
    );
    
  6. Создайте анонимный объект с параметрами, обеспечивающими использование протокола TLS 1.2.

    let sslOptions = {
        secureProtocol: 'TLSv1_2_method'
    };
    
  7. ClientOptions Создайте объект с помощью учетных данных и переменных конфигурации, созданных на предыдущих шагах.

    let clientOptions: ClientOptions = {
        contactPoints: [`${contactPoint}:10350`],
        authProvider: authProvider,
        localDataCenter: region,
        sslOptions: sslOptions
    };
    
  8. Client Создайте объект с помощью переменной clientOptions в конструкторе.

    let client = new Client(clientOptions);
    
  9. Асинхронное подключение к кластеру.

    await client.connect();
    
  10. Создайте новый маппер для пространства ключей cosmicworks и таблицы product. Назовите mapper Product.

    const mapper = new Mapper( client, {
        models: {
            'Product': {
                tables: ['product'],
                keyspace: 'cosmicworks'
            }
        }
    });
    
  11. Создайте экземпляр mapper с помощью forModel функции и Product имени средства сопоставления.

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

Предупреждение

Полная проверка уровня транспорта (TLS) отключена в этом руководстве для упрощения проверки подлинности. Для рабочих развертываний полностью включите проверку.

Обновление-вставка данных

Затем переведите новые данные в таблицу. Upserting гарантирует, что данные создаются или заменяются соответствующим образом в зависимости от того, существуют ли те же данные в таблице.

  1. Создайте новый объект в переменной с именем product.

    const product = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        name: 'Yamba Surfboard',
        category: 'gear-surf-surfboards',
        quantity: 12,
        price: 850.00,
        clearance: false
    };
    
  2. Асинхронно вызовите функцию insert, передавая переменную product, созданную на предыдущем шаге.

    await productMapper.insert(product);
    
  1. Определите новый интерфейс Product с полями, соответствующими таблице, созданной ранее в этом руководстве.

    Тип
    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;
    }
    

    Подсказка

    В Node.jsможно создать этот тип в другом файле или создать его в конце существующего файла.

  2. Создайте новый объект типа Product. Сохраните объект в переменной с именем 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. Асинхронно вызовите функцию insert, передав переменную product, созданную на предыдущем шаге.

    await productMapper.insert(product);
    

Чтение данных

Затем считывайте данные, которые ранее были добавлены в таблицу.

  1. Создайте анонимный объект с именем filter. В этом объекте добавьте свойство id с таким же значением, как и продукт, созданный ранее в этом руководстве.

    const filter = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    };
    
  2. get Вызовите функцию объекта mapper, передаваемого filter в переменную. Сохраните результат в переменной под названием matchedProduct.

    let matchedProduct = await productMapper.get(filter);
    
  1. Создайте анонимный объект с именем filter. В этом объекте добавьте свойство id с таким же значением, как и продукт, созданный ранее в этом руководстве.

    const filter = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    };
    
  2. Вызовите функцию get объекта mapper, передав переменную filter. Сохраните результат в переменной с именем matchedProduct типа Product.

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

Запрос данных

Наконец, используйте запрос, чтобы найти все данные, соответствующие определенному фильтру в таблице.

  1. Создайте новую строковую переменную с именем query, содержащую CQL-запрос, который выбирает элементы с тем же полем category.

    const query = `
    SELECT
        *
    FROM
        cosmicworks.product
    WHERE
        category = :category
    ALLOW FILTERING
    `;
    
  2. Создайте анонимный объект с именем params. В этом объекте добавьте свойство category с таким же значением, как и продукт, созданный ранее в этом руководстве.

    const params = {
        category: 'gear-surf-surfboards'
    };
    
  3. Асинхронно вызвать функцию execute, передав в качестве аргументов переменные query и params. Сохраните свойство результата rows в виде переменной с именем matchedProducts.

    let { rows: matchedProducts } = await client.execute(query, params);
    
  4. Выполните итерацию результатов запроса путем вызова foreach метода в массиве продуктов.

    matchedProducts.forEach(product => {
        // Do something here with each result
    });
    
  1. Создайте новую строковую переменную с именем query, содержащую CQL-запрос, который выбирает элементы с тем же полем category.

    const query: string = `
    SELECT
        *
    FROM
        cosmicworks.product
    WHERE
        category = :category
    ALLOW FILTERING
    `;
    
  2. Создайте анонимный объект с именем params. В этом объекте добавьте свойство category с таким же значением, как и продукт, созданный ранее в этом руководстве.

    const params = {
        category: 'gear-surf-surfboards'
    };
    
  3. Асинхронно вызовите функцию execute, передав ей переменные query и params в качестве аргументов. Сохраните результат в переменной с именем result типа types.ResultSet.

    let result: types.ResultSet = await client.execute(query, params);
    
  4. Сохраните свойство результата rows в виде переменной Product[]типаmatchedProducts.

    let matchedProducts: Product[] = result.rows;
    
  5. Выполните итерацию результатов запроса путем вызова foreach метода в массиве продуктов.

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

Запустите код

Запустите созданное приложение с помощью терминала в каталоге приложения.

node index.js
npx tsx index.ts

Очистите ресурсы

Если учетная запись больше не нужна, удалите учетную запись из подписки Azure, удалив ресурс.

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

Следующий шаг