在本地使用 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?

Azure Cosmos DB 请求存储过程的分区键

创建 Azure Cosmos DB 帐户数据库和集合

无法使用 Microsoft.EntityFrameworkCore.Cosmos 连接到 Azure Cosmos Db 帐户 - 响应状态代码

Azure上找不到MongoDB?不妨试试Azure Cosmos DB