使用@azure/cosmos SDK时Azure函数中的内部500

问题描述 投票:0回答:1

我正在使用 Node 18 TypeScript azure 函数并使用 VSCode 进行开发。我正在使用

@azure/cosmos
SDK 与 CosmosDB 进行交互。我通过首先创建此模块来在函数内创建一个实例:

collection.ts

import { Container, CosmosClient } from "@azure/cosmos";

const endpoint = process.env.COSMOS_DB_ENDPOINT;
const key = process.env.COSMOS_DB_KEY;

const database = process.env.COSMOS_DB_DATABASE;
const container = process.env.COSMOS_DB_COLLECTION;

export default () => {
  const client = new CosmosClient({ endpoint, key });

  return client.database(database).container(container);
};

像这样导入/实例化:

index.ts
(部分功能)

import client from "collection.ts";

const collection = client();

export default async (context, req) => {...}

经过一些测试,我发现它在我实际创建客户端实例的

collection.ts:10
上失败了(
const client = new CosmosClient({ endpoint, key });
)。问题是这一切都在我部署之前进行开发。我称这是一个内部错误,因为我捕获了函数中的异常并返回错误对象,但是当我调用使用此 SDK 的函数时,它不存在。

我认为环境中存在某种断开连接,因此我在门户中添加了端点/密钥/数据库/容器环境变量,并使用 vscode 扩展在本地“下载远程设置...”(环境变量位于门户中配置下的应用程序设置)。我什至尝试使用正确的端点/键对字符串进行硬编码,而不是使用

process.env

我也尝试过查看日志流,但没有多大帮助:

2023-09-06T08:57:57Z   [Error]   Executed 'Functions.LoginUser' (Failed, Id=6c7dc7c5-a942-4b93-89d8-a354e1d6a868, Duration=2ms)

我不知道还能尝试什么。如果需要,我可以提供更多信息。任何想法将不胜感激!

javascript typescript azure azure-functions azure-cosmosdb
1个回答
0
投票

我在本地和门户中都通过以下方式得到了预期的结果

创建了一个 HTTP 触发器函数,然后尝试调用其中的

collection.ts
文件。您也可以使用定时器触发功能。

集合.ts

import { Container, CosmosClient } from  "@azure/cosmos";

const  endpoint  =  process.env.COSMOS_DB_ENDPOINT;
const  key  =  process.env.COSMOS_DB_KEY;
const  database  =  process.env.COSMOS_DB_DATABASE;
const  container  =  process.env.COSMOS_DB_COLLECTION;

export  default () => {
const  client  =  new  CosmosClient({ endpoint, key });
return  client.database(database).container(container);
};

httpTrigger.ts

import { app, HttpRequest, HttpResponseInit, InvocationContext } from  "@azure/functions";
import  client  from  "./collection";

const  collection  =  client();

export  default  async  function  httpTrigger1(request:  HttpRequest, context:  InvocationContext):  Promise<HttpResponseInit> {
context.log(`Cosmos DB data:`,collection);
context.log(`Http function processed request for url "${request.url}"`);
const  name  =  request.query.get('name') ||  await  request.text() ||  'world';
return { body:  `Hello, ${name}!` };
};
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel:  'anonymous',
handler:  httpTrigger1
});

local.settings.json

{

"IsEncrypted": false,
"Values": {

"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "node",
"AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
"COSMOS_DB_ENDPOINT": "<Enter Cosmos DB endpoint here>",
"COSMOS_DB_KEY": "<Enter Cosmos DB Key here>",
"COSMOS_DB_DATABASE": "<Cosmos DB Database Name>",
"COSMOS_DB_COLLECTION": "<Cosmos DB Container Name>"

}
}

本地输出:

本地输出1

本地输出2

部署后,我已在 Function App 的App Settings中添加了凭据。

我触发了该函数并得到了预期的输出

© www.soinside.com 2019 - 2024. All rights reserved.