在本地使用 Cosmos DB 运行 Azure Functions - 找不到 CosmosDBAttribute.ConnectionStringSetting
Posted
技术标签:
【中文标题】在本地使用 Cosmos DB 运行 Azure Functions - 找不到 CosmosDBAttribute.ConnectionStringSetting【英文标题】:Running Azure Functions with Cosmos DB locally - cannot find CosmosDBAttribute.ConnectionStringSetting 【发布时间】:2022-01-07 06:31:19 【问题描述】:尝试运行该函数时出现以下错误: 无法解析属性“CosmosDBAttribute.ConnectionStringSetting”的值。确保设置存在且具有有效值。
该属性同时存在于 local.settings.json 和我在 Azure 上的应用程序设置中。
一个重要的一点:它现在可以在我的机器上运行,但它不能正常工作。即使我没有进行任何更改,它也开始不知所措。对于其他试图在他们的机器上运行它的人来说,它仍然不起作用。
另一个重要的一点:他们可以通过将属性添加到他们 PC 上的环境变量来使其工作,但这只是一种解决方法。
我正在使用 Windows 10 并使用 Intellij 作为我的 IDE。
这是我要运行的函数的代码:
@FunctionName("postLogItem")
public HttpResponseMessage post(
@HttpTrigger(name = "req",
methods = HttpMethod.GET, HttpMethod.POST,
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@CosmosDBOutput(
name = "document",
databaseName = "AuditLog",
collectionName = "Logs",
connectionStringSetting = "CosmosDBAttribute.ConnectionStringSetting")
OutputBinding<String> document,
final ExecutionContext context)
// Item list
context.getLogger().info("Parameters are: " + System.getenv("CosmosDBAttribute.ConnectionStringSetting"));
// Parse query parameter
String query = request.getQueryParameters().get("desc");
String name = request.getBody().orElse(query);
// Generate random ID
final int id = Math.abs(new Random().nextInt());
// Generate document
final String jsonDocument = "\"id\":\"" + id + "\", " +
"\"description\": \"" + name + "\"";
context.getLogger().info("Document to be saved: " + jsonDocument);
//LogItem item = new LogItem("123", "101010", "'name':'potato'", LogItem.TYPE.PAYMENT);
document.setValue(jsonDocument);
return request.createResponseBuilder(HttpStatus.OK)
.body("Document created successfully.")
.build();
【问题讨论】:
connectionStringSetting
的值通常是设置的名称(在本地 json 中或在函数的连接字符串部分中创建)。你把CosmosDBAttribute.ConnectionStringSetting
问题可能出在点上了。您是否尝试过使用 CosmosDBConnection
之类的东西,然后将其用作函数应用程序中的连接字符串或设置名称?
这不起作用。让我澄清一下,“CosmosDBAttribute.ConnectionStringSetting”是出现在错误消息中的内容,而不是我定义的某个值。我是后来才定义的。最初我使用了像 CosmosDbConnection 这样的值。我应该补充一点,我正在使用 Java,也许这就是导致某些问题的原因?
该值出现在错误消息中,因为它在您共享的代码中:connectionStringSetting = "CosmosDBAttribute.ConnectionStringSetting"
,您告诉函数您希望从名为 CosmosDBAttribute.ConnectionStringSetting
的设置中读取连接字符串。该点可能会导致问题,因此我会将其更改为 connectionStringSetting = "MyCosmosConfig"
或其他简单的名称,并在 Function App 中创建一个具有该名称的配置。
就像我说的,我只是在错误消息中看到它之后才定义它。另外,我尝试了您今天早些时候描述的内容,但没有解决。
您是在函数应用程序的应用程序设置或连接字符串部分定义它们吗?您是否尝试过在另一个方面定义它?
【参考方案1】:
无法解析属性“CosmosDBAttribute.ConnectionStringSetting”的值。确保设置存在且具有有效值。
对于上述错误,我已经在本地环境中进行了测试,并提供了相应的代码对您的代码进行更改。
在您的 host.json 文件中,删除连接字符串变量中的点 (.) 并保留下划线 (_),然后在函数类文件中使用相同的变量,因为您可以在上面的两个主机中看到我的连接字符串变量.json文件和函数类文件。
**local.settings.json**
"IsEncrypted": false,
"Values": "
AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet",
"cosmosdbtvk_DOCUMENTDB": "<PRIMARY CONNECTION STRING OF SOURCE COLLECTION>",
"endpointUrl":"<URI OF TARGET COLLECTION>",
"primaryKey": "<PRIMARY KEY OF TARGET COLLECTION>"
**Class file:**
[FunctionName("CosmosDBTriggerCSharp1")]
public static async Task Run([CosmosDBTrigger(
databaseName: "database",
collectionName: "collection1",
ConnectionStringSetting = "cosmosdbtvk_DOCUMENTDB", LeaseCollectionName = "leases", CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> input, ILogger log)
【讨论】:
如果我的回答对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记,将其从灰色切换为已填充。)。这对其他社区成员可能是有益的。谢谢 嗨,这不起作用。让我澄清一下,“CosmosDBAttribute.ConnectionStringSetting”是出现在错误消息中的内容,而不是我定义的某个值。我是后来才定义的。最初我使用了像 CosmosDbConnection 这样的值。我应该补充一点,我正在使用 Java,也许这就是导致某些问题的原因?以上是关于在本地使用 Cosmos DB 运行 Azure Functions - 找不到 CosmosDBAttribute.ConnectionStringSetting的主要内容,如果未能解决你的问题,请参考以下文章
Azure Cosmos DB 中托管的 MongoDB:分片与分区
是否可以使用 Java SDK 通过反向代理连接到 Azure Cosmos DB?
无法使用 Microsoft.EntityFrameworkCore.Cosmos 连接到 Azure Cosmos Db 帐户 - 响应状态代码