Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Comienza con la biblioteca cliente de Azure Cosmos DB para Apache Cassandra de Node.js para almacenar, administrar y consultar datos no estructurados. Siga los pasos de esta guía para crear una cuenta, instalar una biblioteca cliente de Node.js, conectarse a la cuenta, realizar operaciones comunes y consultar los datos finales de ejemplo.
Documentación de referencia de la API | Código fuente de la biblioteca | Paquete (npm)
Prerrequisitos
Una suscripción de Azure
- Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
La versión más reciente de Azure CLI en Azure Cloud Shell.
- Si prefiere ejecutar comandos de referencia de la CLI localmente, inicie sesión en la CLI de Azure mediante el
az logincomando .
- Si prefiere ejecutar comandos de referencia de la CLI localmente, inicie sesión en la CLI de Azure mediante el
- Node.js 22 o posteriores
Instalación
Primero, configure la cuenta y el entorno de desarrollo para esta guía. En esta sección se explica el proceso de creación de una cuenta, la obtención de sus credenciales y la preparación del entorno de desarrollo.
Crear una cuenta
Empiece por crear una API para una cuenta de Apache Cassandra. Una vez creada la cuenta, cree los recursos de espacio de claves y tabla.
Si aún no tiene un grupo de recursos de destino, use el
az group createcomando para crear un nuevo grupo de recursos en la suscripción.az group create \ --name "<resource-group-name>" \ --location "<location>"Use el
az cosmosdb createcomando para crear una nueva cuenta de Azure Cosmos DB para Apache Cassandra con la configuración predeterminada.az cosmosdb create \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --locations "regionName=<location>" \ --capabilities "EnableCassandra"Cree un nuevo espacio de claves usando
az cosmosdb cassandra keyspace createllamadocosmicworks.az cosmosdb cassandra keyspace create \ --resource-group "<resource-group-name>" \ --account-name "<account-name>" \ --name "cosmicworks"Cree un nuevo objeto JSON para representar el esquema mediante un comando bash de varias líneas. A continuación, use el
az cosmosdb cassandra table createcomando para crear una nueva tabla denominadaproducts.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"
Obtener credenciales
Ahora, obtenga la contraseña de la biblioteca cliente que se usará para crear una conexión a la cuenta creada recientemente.
Use
az cosmosdb showpara obtener el punto de contacto y el nombre de usuario de la cuenta.az cosmosdb show \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --query "{username:name,contactPoint:documentEndpoint}"Registre el valor de las propiedades
contactPointyusernamede la salida de los comandos anteriores. Los valores de estas propiedades son el punto de contacto y el nombre de usuario que usa más adelante en esta guía para conectarse a la cuenta con la biblioteca.Use
az cosmosdb keys listpara obtener las claves de la cuenta.az cosmosdb keys list \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --type "keys"Registre el valor de la propiedad
primaryMasterKeyde la salida de los comandos anteriores. El valor de esta propiedad es la contraseña que se usa más adelante en esta guía para conectarse a la cuenta con la biblioteca.
Preparación del entorno de desarrollo
A continuación, configure el entorno de desarrollo con un nuevo proyecto y la biblioteca cliente. Este paso es el último requisito previo necesario antes de pasar al resto de esta guía.
Inicie en una carpeta vacía.
Inicialice un nuevo módulo.
npm init es6 --yesInstale el
cassandra-driverpaquete desde el Administrador de paquetes de Node (npm).npm install --save cassandra-driverCree el archivo index.js .
Inicie en un directorio vacío.
Inicialice un nuevo módulo.
npm init es6 --yesInstale el
typescriptpaquete desde el Administrador de paquetes de Node (npm).npm install --save-dev typescriptInstale el
tsxpaquete desde npm.npm install --save-dev tsxInstale el
cassandra-driverpaquete desde npm.npm install --save cassandra-driverInicialice el proyecto de TypeScript mediante el compilador (
tsc).npx tsc --init --target es2017 --module es2022 --moduleResolution nodenextCree el archivo index.ts .
Modelo de objetos
| Descripción | |
|---|---|
Client |
Representa una conexión específica a un clúster |
Mapper |
Cliente del lenguaje de consulta cassandra (CQL) usado para ejecutar consultas |
Ejemplos de código
Autenticar cliente
Empiece por autenticar al cliente con las credenciales recopiladas anteriormente en esta guía.
Abra el archivo index.js en el entorno de desarrollo integrado (IDE).
Importe los siguientes tipos desde el
cassandra-drivermódulo:cassandracassandra.Clientcassandra.mapping.Mappercassandra.auth.PlainTextAuthProvider
import cassandra from 'cassandra-driver'; const { Client } = cassandra; const { Mapper } = cassandra.mapping; const { PlainTextAuthProvider } = cassandra.auth;Cree variables constantes de cadena para las credenciales recopiladas anteriormente en esta guía. Asigne un nombre a las variables
username,passwordycontactPoint.const username = '<username>'; const password = '<password>'; const contactPoint = '<contact-point>';Cree otra variable de cadena para la región donde ha creado la cuenta de Azure Cosmos DB for Apache Cassandra. Asigne a esta variable
regionel nombre .const region = '<azure-region>';Cree un nuevo
PlainTextAuthProviderobjeto con las credenciales especificadas en los pasos anteriores.let authProvider = new PlainTextAuthProvider( username, password );Cree un
Clientobjeto con las variables de configuración y credenciales creadas en los pasos anteriores.let client = new Client({ contactPoints: [`${contactPoint}:10350`], authProvider: authProvider, localDataCenter: region, sslOptions: { secureProtocol: 'TLSv1_2_method' }, });Conéctese de forma asincrónica al clúster.
await client.connect();Cree un nuevo mapeador que tenga como destino el
cosmicworksespacio de claves y laproducttabla. Asigne al asignadorProductel nombre .const mapper = new Mapper(client, { models: { 'Product': { tables: ['product'], keyspace: 'cosmicworks' } } });Genere una instancia del mapeador mediante la función
forModely el nombre del mapeadorProduct.const productMapper = mapper.forModel('Product');
Abra el archivo index.ts en el entorno de desarrollo integrado (IDE).
Importe los siguientes tipos desde el
cassandra-drivermódulo:cassandra.authcassandra.mappingcassandra.typescassandra.Clientcassandra.ClientOptionscassandra.mapping.Mappercassandra.auth.PlainTextAuthProvider
import { auth, mapping, types, Client, ClientOptions } from 'cassandra-driver'; const { Mapper } = mapping; const { PlainTextAuthProvider } = auth;Cree variables constantes de cadena para las credenciales recopiladas anteriormente en esta guía. Asigne un nombre a las variables
username,passwordycontactPoint.const username: string = '<username>'; const password: string = '<password>'; const contactPoint: string = '<contact-point>';Cree otra variable de cadena para la región donde ha creado la cuenta de Azure Cosmos DB for Apache Cassandra. Asigne a esta variable
regionel nombre .const region: string = '<azure-region>';Cree un nuevo
PlainTextAuthProviderobjeto con las credenciales especificadas en los pasos anteriores.let authProvider = new PlainTextAuthProvider( username, password );Cree un objeto anónimo con opciones que garantice el uso del protocolo de seguridad de la capa de transporte (TLS) 1.2.
let sslOptions = { secureProtocol: 'TLSv1_2_method' };Cree un
ClientOptionsobjeto con las variables de configuración y credenciales creadas en los pasos anteriores.let clientOptions: ClientOptions = { contactPoints: [`${contactPoint}:10350`], authProvider: authProvider, localDataCenter: region, sslOptions: sslOptions };Cree un
Clientobjeto mediante laclientOptionsvariable en el constructor.let client = new Client(clientOptions);Conéctese de forma asincrónica al clúster.
await client.connect();Cree un nuevo mapeador que tenga como destino el
cosmicworksespacio de claves y laproducttabla. Asigne al asignadorProductel nombre .const mapper = new Mapper( client, { models: { 'Product': { tables: ['product'], keyspace: 'cosmicworks' } } });Genere una instancia del mapeador mediante la función
forModely el nombre del mapeadorProduct.const productMapper = mapper.forModel('Product');
Advertencia
La validación completa de la seguridad de la capa de transporte (TLS) está deshabilitada en esta guía para simplificar la autenticación. Para las implementaciones de producción, habilite completamente la validación.
Inserción o actualización de datos
A continuación, actualice los datos nuevos en una tabla. Upserting garantiza que los datos se creen o reemplacen adecuadamente en función de si los mismos datos ya existen en la tabla.
Cree un nuevo objeto en una variable denominada
product.const product = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', name: 'Yamba Surfboard', category: 'gear-surf-surfboards', quantity: 12, price: 850.00, clearance: false };Invoque de forma asincrónica la
insertfunción pasando laproductvariable creada en el paso anterior.await productMapper.insert(product);
Defina una nueva interfaz denominada
Productcon campos correspondientes a la tabla creada anteriormente en esta guía.Tipo IdstringNamestringCategorystringQuantityintPricedecimalClearanceboolinterface Product { id: string; name: string; category: string; quantity: number; price: number; clearance: boolean; }Sugerencia
En Node.js, puede crear este tipo en otro archivo o crearlo al final del archivo existente.
Cree un nuevo objeto de tipo
Product. Almacene el objeto en una variable denominadaproduct.const product: Product = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', name: 'Yamba Surfboard', category: 'gear-surf-surfboards', quantity: 12, price: 850.00, clearance: false };Invoque de forma asincrónica la
insertfunción pasando laproductvariable creada en el paso anterior.await productMapper.insert(product);
Leer datos
A continuación, lea los datos que se han insertado o actualizado anteriormente en la tabla.
Cree un objeto anónimo denominado
filter. En este objeto, incluya una propiedad denominadaidcon el mismo valor que el producto creado anteriormente en esta guía.const filter = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' };Invoque la función
getdel mapper pasando la variablefilter. Almacene el resultado en una variable denominadamatchedProduct.let matchedProduct = await productMapper.get(filter);
Cree un objeto anónimo denominado
filter. En este objeto, incluya una propiedad denominadaidcon el mismo valor que el producto creado anteriormente en esta guía.const filter = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' };Invoque la función
getdel mapper pasando la variablefilter. Almacene el resultado en una variable denominadamatchedProductde tipoProduct.let matchedProduct: Product = await productMapper.get(filter);
Consultar datos
Por último, use una consulta para buscar todos los datos que coincidan con un filtro específico de la tabla.
Cree una nueva variable de cadena denominada
querycon una consulta CQL que coincida con los elementos con el mismocategorycampo.const query = ` SELECT * FROM cosmicworks.product WHERE category = :category ALLOW FILTERING `;Cree un objeto anónimo denominado
params. En este objeto, incluya una propiedad denominadacategorycon el mismo valor que el producto creado anteriormente en esta guía.const params = { category: 'gear-surf-surfboards' };Invoque de forma asincrónica la
executefunción pasando lasqueryvariables yparamscomo argumentos. Almacene la propiedad delrowsresultado como una variable denominadamatchedProducts.let { rows: matchedProducts } = await client.execute(query, params);Iteración de los resultados de la consulta invocando el
foreachmétodo en la matriz de productos.matchedProducts.forEach(product => { // Do something here with each result });
Cree una nueva variable de cadena denominada
querycon una consulta CQL que coincida con los elementos con el mismocategorycampo.const query: string = ` SELECT * FROM cosmicworks.product WHERE category = :category ALLOW FILTERING `;Cree un objeto anónimo denominado
params. En este objeto, incluya una propiedad denominadacategorycon el mismo valor que el producto creado anteriormente en esta guía.const params = { category: 'gear-surf-surfboards' };Invoque de forma asincrónica la
executefunción pasando lasqueryvariables yparamscomo argumentos. Almacene el resultado en una variable denominadaresultde tipotypes.ResultSet.let result: types.ResultSet = await client.execute(query, params);Almacene la propiedad del
rowsresultado como una variable denominadamatchedProductsde tipoProduct[].let matchedProducts: Product[] = result.rows;Iteración de los resultados de la consulta invocando el
foreachmétodo en la matriz de productos.matchedProducts.forEach((product: Product) => { // Do something here with each result });
Ejecución del código
Ejecute la aplicación recién creada mediante un terminal en el directorio de la aplicación.
node index.js
npx tsx index.ts
Limpieza de recursos
Cuando ya no necesite la cuenta, quite la cuenta de la suscripción de Azure mediante la eliminación del recurso.
az cosmosdb delete \
--resource-group "<resource-group-name>" \
--name "<account-name>"