Azure 函数的 CosmosDBInput 绑定未使用 HttpTrigger 中定义的路径变量

CosmosDBInput binding of Azure Function is not using path Variable defined in HttpTrigger

我使用 azure-functions-kotlin-archetype 创建了一个 Kotlin 函数。我创建了一个 Http 触发器和一个 cosmos 输入绑定来从 cosmos 读取数据。我已经提到 sql 查询也可以获取数据。我想将路径变量传递给应该在查询中用作参数的 http 触发器。 根据 Microsoft 文档,我相应地定义了路径参数。 https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb-v2-input?tabs=java#http-trigger-get-multiple-docs-from-route-data-using-sqlquery-java

但我得到的是空白响应,这意味着未获取任何数据。如果我在 Sql 查询中对参数进行硬编码,我就能够获取数据。谁能告诉我这里的问题。功能码如下

@FunctionName("GetData")
    fun run(
            @HttpTrigger(
                    name = "req",
                    methods = [HttpMethod.GET],
                    authLevel = AuthorizationLevel.ANONYMOUS,
            route = "/api/getItems/{id}/{qnt}"
            )
            request: HttpRequestMessage<Optional<String>>,
            @CosmosDBInput(
                name = "cosmosdb",
                databaseName = "item-db",
                collectionName = "item",
                sqlQuery = "SELECT * FROM ITEM n where n.id= {id} "
                             +"and n.qnt = {qnt}",
              connectionStringSetting = "Cosmos_DB_Connection_String"
            )
            rs: Array<String>,
            context: ExecutionContext): HttpResponseMessage {



            return request
                    .createResponseBuilder(HttpStatus.OK)
                    .body(rs)
                    .build()
        }

}

根据您提供的示例查询:SELECT * FROM ITEM n where n.id= {'ID1'} " +"and n.qnt = {1},似乎 id 是字符串而 qnt 是数字。当我们从 route 中获取参数时,它会将参数视为字符串。所以如果你直接在sqlQuery中使用route的参数,它会select这样的数据sql:SELECT * FROM ITEM n where n.id = 'ID1' and n.qnt = '1'。所以没有数据被获取。

您需要从 route 获取参数 qnt 作为数字而非字符串,因此请使用 route = "api/getItems/{id}/{qnt:int}".

===========================更新======= ==================

添加此更新以供其他社区参考:

在 sql 查询中使用方法 StringToNumber(),如 sqlQuery = "SELECT * FROM ITEM n where n.id= {id} " + "and n.qnt = StringToNumber({qnt})"