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})"
。
我使用 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})"
。