En mi implementación actual, tengo un código de inicialización de la base de datos que se ejecuta en cada solicitud de función, lo cual es malo por motivos de rendimiento.
¿Cómo verificar si existe un contenedor en cosmos DB usando el nodo sdk?
Lo mejor es crear conexiones estáticas en la inicialización de la aplicación como se describe aquí: https://docs.microsoft.com/en-us/azure/azure-functions/manage-connections#static-clients
pero estoy teniendo un poco de problema con la inicialización. Así es como la documentación lo describe en javascript.
const cosmos = require('@azure/cosmos'); const endpoint = process.env.COSMOS_API_URL; const key = process.env.COSMOS_API_KEY; const { CosmosClient } = cosmos; const client = new CosmosClient({ endpoint, key }); // All function invocations also reference the same database and container. const container = client.database("MyDatabaseName").container("MyContainerName"); module.exports = async function (context) { const { resources: itemArray } = await container.items.readAll().fetchAll(); context.log(itemArray); }Los problemas/preguntas que tengo son cómo manejo los errores si la base de datos no existe o si el contenedor no existe.
¿Necesito separar completamente mi lógica "createIfNotExists" de la aplicación de funciones?
Si trato de ejecutar el código createIfNotExists en el inicio, no puedo hacer esperas de nivel superior y recibo errores de rechazo de promesas.
Me gustaría hacer algo como lo siguiente:
try { const cosmos = require('@azure/cosmos'); const endpoint = process.env.COSMOS_API_URL; const key = process.env.COSMOS_API_KEY; const { CosmosClient } = cosmos; const client = new CosmosClient({ endpoint, key }); const db = await client.databases.createIfNotExists({id: "databaseId"}); const container1 = await db.container.createIfNotExists(containerDefinition1) const container2 = await db.container.createIfNotExists(containerDefinition2) } catch(err) { handleError(err) } ... module.exports = async function (context) { ... const {resources: items } = await container1.items.query(querySpec).fetchAll(); }¿Cuál es la mejor manera de implementar esto? ¡Cualquier ayuda es apreciada!
Creo que necesitas manejar cada uno individualmente, por ejemplo
async onApplicationLoad() { // Create DB if it doesn't exist try { await this.client.databases.createIfNotExists({ id: this.mDBId }); } catch (error) { Logger.log(`Error creating database: ${error}`, 'AzureCosmosDbService'); } // Create the containers if they don't exist try { await this.client.database(this.mDBId).containers.createIfNotExists({ id: this.mNoteContainerId }); await this.client.database(this.mDBId).containers.createIfNotExists({ id: this.mReportedNotesContainerId }); const iterator = this.client.database(this.mDBId).containers.readAll(); const { resources: containersList } = await iterator.fetchAll(); } catch (error) { Logger.log(`Error creating containers: ${error}`, 'AzureCosmosDbService'); } return; }