在我当前的实现中,我有在每个函数请求上运行的数据库初始化代码,这出于性能原因而很糟糕。
How to check if a container exists in cosmos DB using the node sdk?
最好在应用初始化时创建静态连接,如下所述: https://learn.microsoft.com/en-us/azure/azure-functions/manage-connections#static-clients
但是我在初始化时遇到了一些麻烦。以下是文档中如何用 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);
}
我遇到的问题是如果数据库不存在或容器不存在,如何进行错误处理。
我需要将“createIfNotExists”逻辑与函数应用完全分离吗?
如果我尝试在启动时运行 createIfNotExists 代码,我将无法执行顶级等待,并且会收到 promise 拒绝错误。
我想做如下的事情:
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();
}
实现这一点的最佳方法是什么?如有任何帮助,我们将不胜感激!
最佳答案
例如,我认为您需要单独处理每个
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;
}
关于node.js - 如何使用node sdk在azure函数中初始化cosmosDB数据库和容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67589048/