node.js - 如何使用node sdk在azure函数中初始化cosmosDB数据库和容器?

标签 node.js typescript azure azure-functions azure-cosmosdb

在我当前的实现中,我有在每个函数请求上运行的数据库初始化代码,这出于性能原因而很糟糕。

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/

相关文章:

node.js - 无法将我自己的 Node js部署到aws elastic beanstalk

html - 如何判断我的 Node 应用程序在 Heroku 上崩溃的原因? (HTML、Stripe、Heroku、NodeJS)

javascript - 访问 Promise .then 在 Promise 之外返回的值

reactjs - 在 typescript 中增加 react 类型的问题

azure - CosmosDB - FeedOptions.DisableRUPerMinuteUsage 实际上做了什么?

javascript - 使用 postman Express 发送带有原始 json 的 POST 数据

html - 无法分配给类型错误的 Angular BehaviourSubject 问题

Angular2/Rxjs : 'catch' on observable giving ProgressEvent instead of json from response

Azure InstanceInput 终结点使用情况

Azure 应用程序服务 - Docker 组成多容器应用程序 - 无 Docker 日志