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


Создание консольного приложения Node.js с помощью Azure DocumentDB

Это руководство поможет вам создать консольное приложение Node.js для подключения к кластеру Azure DocumentDB. Вы подготавливаете среду разработки, используете пакет Azure SDK для JavaScript для аутентификации и выполнения общих операций с документами в базе данных.

Предпосылки

  • Существующий кластер Azure DocumentDB

  • Настроена проверка подлинности Microsoft Entra для кластера с ролью, предоставленной вашему идентификатору root.

  • Последняя версия с долгосрочной поддержкой (LTS) Node

Настройка консольного приложения

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

  1. Создайте новый каталог для вашего проекта и инициализируйте его с помощью npm init.

    mkdir mongodb-app
    cd mongodb-app
    npm init -y
    
  2. Настройте TypeScript в проекте.

    npm install typescript ts-node @types/node --save-dev
    npx tsc --init
    
  3. Создайте основной файл app.ts TypeScript для приложения.

    touch app.ts
    
  4. Установите библиотеку @azure/identity для проверки подлинности.

    npm install @azure/identity
    
  5. Установите библиотеку mongodb.

    npm install mongodb
    

Подключение к кластеру

Теперь используйте библиотеку Azure.Identity, чтобы получить TokenCredential для подключения к вашему кластеру. Официальный драйвер MongoDB имеет специальный интерфейс, который должен быть реализован для получения маркеров из Microsoft Entra для использования при подключении к кластеру.

  1. Импортируйте необходимые модули в верхней части файла JavaScript.

    import { MongoClient } from 'mongodb';
    import { DefaultAzureCredential } from '@azure/identity';
    
  2. Создайте функцию обратного вызова, которая получает токены из экземпляра TokenCredential по мере необходимости.

    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. Задайте переменную имени кластера для подключения к кластеру Azure DocumentDB.

    const clusterName = '<azure-documentdb-cluster-name>';
    
  4. Создайте экземпляр DefaultAzureCredential.

    const credential = new DefaultAzureCredential();
    
  5. Создайте клиент MongoDB, настроенный с помощью проверки подлинности 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. Импортируйте необходимые модули в верхней части файла TypeScript.

    import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';
    import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';
    
  2. Создайте функцию обратного вызова, которая получает токены из экземпляра TokenCredential по мере необходимости.

    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. Задайте переменную имени кластера для подключения к кластеру Azure DocumentDB.

    const clusterName: string = '<azure-documentdb-cluster-name>';
    
  4. Создайте экземпляр DefaultAzureCredential.

    const credential: TokenCredential = new DefaultAzureCredential();
    
  5. Создайте клиент MongoDB, настроенный с помощью проверки подлинности 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');
    

Выполнение распространенных операций

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

  1. Получите ссылку на базу данных по имени.

    const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks';
    
    console.log('Database pointer created');
    
  2. Получите ссылку на коллекцию.

    const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products';
    
    console.log('Collection pointer created');
    
  3. Создайте документ с помощью collection.updateOne, и затем обновите или вставьте его в коллекцию.

    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. Используется collection.findOne для получения определенного документа из коллекции.

    const filter = { _id: request.params.id };
    
    var document = await collection.findOne(filter, options);
    
    console.log(`Read document _id:\t${document._id}`);
    
  5. Запрос нескольких документов, соответствующих фильтру, с помощью 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. По завершении закройте клиентское подключение MongoDB.

    await client.close();
    
  1. Получите ссылку на базу данных по имени.

    const database: Db = client.db('<database-name>');
    
    console.log('Database pointer created');
    
  2. Получите ссылку на коллекцию.

    const collection: Collection<Product> = database.collection<Product>('<collection-name>');
    
    console.log('Collection pointer created');
    
  3. Определите интерфейс для представления документов продукта.

    interface Product {
        _id: string;
        category: string;
        name: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    
  4. Создайте документ с помощью collection.updateOne, и затем обновите или вставьте его в коллекцию.

    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. Используется collection.findOne для получения определенного документа из коллекции.

    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. Запрос нескольких документов, соответствующих фильтру, с помощью 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. По завершении закройте клиентское подключение MongoDB.

    await client.close();