Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Это руководство поможет вам создать консольное приложение Node.js для подключения к кластеру Azure DocumentDB. Вы подготавливаете среду разработки, используете пакет Azure SDK для JavaScript для аутентификации и выполнения общих операций с документами в базе данных.
Предпосылки
подписка Azure
- Если у вас нет подписки Azure, создайте бесплатную учетную запись.
Существующий кластер Azure DocumentDB
- Если у вас нет кластера, создайте новый кластер
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье "Начало работы с Azure Cloud Shell".
Если вы предпочитаете запускать справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, подумайте о запуске Azure CLI в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, войдите в Azure CLI с помощью команды az login . Чтобы завершить процесс аутентификации, следуйте шагам, отображаемым в вашем терминале. Сведения о других параметрах входа см. в статье "Проверка подлинности в Azure с помощью Azure CLI".
Когда вас попросят, установите расширение Azure CLI при первом использовании. Дополнительные сведения о расширениях см. в статье Использование расширений и управление ими с помощью Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
Настроена проверка подлинности Microsoft Entra для кластера с ролью, предоставленной вашему идентификатору
root.- Чтобы включить проверку подлинности Microsoft Entra, ознакомьтесь с руководством по настройке.
Последняя версия с долгосрочной поддержкой (LTS) Node
- Последняя версия TypeScript.
Настройка консольного приложения
Затем создайте проект консольного приложения и импортируйте необходимые библиотеки для проверки подлинности в кластере.
Создайте новый каталог для вашего проекта и инициализируйте его с помощью
npm init.mkdir mongodb-app cd mongodb-app npm init -yНастройте TypeScript в проекте.
npm install typescript ts-node @types/node --save-dev npx tsc --initСоздайте основной файл app.ts TypeScript для приложения.
touch app.tsУстановите библиотеку
@azure/identityдля проверки подлинности.npm install @azure/identityУстановите библиотеку
mongodb.npm install mongodb
Подключение к кластеру
Теперь используйте библиотеку Azure.Identity, чтобы получить TokenCredential для подключения к вашему кластеру. Официальный драйвер MongoDB имеет специальный интерфейс, который должен быть реализован для получения маркеров из Microsoft Entra для использования при подключении к кластеру.
Импортируйте необходимые модули в верхней части файла JavaScript.
import { MongoClient } from 'mongodb'; import { DefaultAzureCredential } from '@azure/identity';Создайте функцию обратного вызова, которая получает токены из экземпляра
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), }; };Задайте переменную имени кластера для подключения к кластеру Azure DocumentDB.
const clusterName = '<azure-documentdb-cluster-name>';Создайте экземпляр
DefaultAzureCredential.const credential = new DefaultAzureCredential();Создайте клиент 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');
Импортируйте необходимые модули в верхней части файла TypeScript.
import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity'; import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';Создайте функцию обратного вызова, которая получает токены из экземпляра
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) }; };Задайте переменную имени кластера для подключения к кластеру Azure DocumentDB.
const clusterName: string = '<azure-documentdb-cluster-name>';Создайте экземпляр
DefaultAzureCredential.const credential: TokenCredential = new DefaultAzureCredential();Создайте клиент 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 для управления коллекциями и элементами.
Получите ссылку на базу данных по имени.
const databaseName = process.env.SETTINGS__DATABASENAME ?? 'cosmicworks'; console.log('Database pointer created');Получите ссылку на коллекцию.
const collectionName = process.env.SETTINGS__COLLECTIONNAME ?? 'products'; console.log('Collection pointer created');Создайте документ с помощью
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}`); }Используется
collection.findOneдля получения определенного документа из коллекции.const filter = { _id: request.params.id }; var document = await collection.findOne(filter, options); console.log(`Read document _id:\t${document._id}`);Запрос нескольких документов, соответствующих фильтру, с помощью
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)}`); }По завершении закройте клиентское подключение MongoDB.
await client.close();
Получите ссылку на базу данных по имени.
const database: Db = client.db('<database-name>'); console.log('Database pointer created');Получите ссылку на коллекцию.
const collection: Collection<Product> = database.collection<Product>('<collection-name>'); console.log('Collection pointer created');Определите интерфейс для представления документов продукта.
interface Product { _id: string; category: string; name: string; quantity: number; price: number; clearance: boolean; }Создайте документ с помощью
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}`); }Используется
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}`);Запрос нескольких документов, соответствующих фильтру, с помощью
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)}`); }По завершении закройте клиентское подключение MongoDB.
await client.close();