我正在使用 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)
我不知道还能尝试什么。如果需要,我可以提供更多信息。任何想法将不胜感激!
我在本地和门户中都通过以下方式得到了预期的结果
创建了一个 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>"
}
}
本地输出:
部署后,我已在 Function App 的App Settings中添加了凭据。
我触发了该函数并得到了预期的输出。