缺少 url 查询时 Azure 函数崩溃
Azure Function crashes upon missing url query
我有一个具有以下配置的 Azure-Function
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "res"
},
{
"type": "cosmosDB",
"name": "inputDocument",
"databaseName": "MeasureInputData",
"collectionName": "hubs",
"connectionStringSetting": "measure-cosmosdb_DOCUMENTDB",
"direction": "in",
"sqlQuery": "SELECT * FROM c WHERE c.uuid = {hub}"
}
],
"disabled": false
}
正如您在上面看到的,我将 sqlQuery
中的 {hub}
作为 url 参数传递。
做一个像
这样的请求
https://<my-function-url>?code=<my-function-key>&hub=<my-hub-id>
returns 匹配的中心。
如果将值 <my-hub-id>
留空
https://<my-function-url>?code=<my-function-key>&hub=
returns 一个空对象。
问题是当我不在 URL 中提供 hub
参数时,函数崩溃。
https://<my-function-url>?code=<my-function-key>
要求以上returnshttp status code 500
不应该以某种方式处理丢失的查询参数吗?
谢谢
不,你应该处理那个。如果您查看 hello world 示例:
[FunctionName("HttpTriggerCSharp")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
HttpRequest req, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
它尝试从查询字符串和正文中读取值。如果它为空,它将 return
new BadRequestObjectResult("Please pass a name on the query string or in the request body")
所以你也应该这样做,以防查询字符串中没有提供集线器,return 400(错误请求)
看来 sql 会是
SELECT * FROM c WHERE c.uuid =
但不是
SELECT * FROM c WHERE c.uuid = "" or SELECT * FROM c WHERE c.uuid = null
当参数 "hub" 缺失时。
Azure 函数 cosmos db 绑定将不会处理查询中缺少的参数。如果你想处理这个错误,我想我们可以创建另一个 api 或函数,并将原始函数 url 放入(调用)这个新的 api/function 中。那么我们可以在新的api/function.
中处理这个错误
如果您希望azure function添加此功能,可以将您的想法提出到azure function feedback页面。
我有一个具有以下配置的 Azure-Function
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "res"
},
{
"type": "cosmosDB",
"name": "inputDocument",
"databaseName": "MeasureInputData",
"collectionName": "hubs",
"connectionStringSetting": "measure-cosmosdb_DOCUMENTDB",
"direction": "in",
"sqlQuery": "SELECT * FROM c WHERE c.uuid = {hub}"
}
],
"disabled": false
}
正如您在上面看到的,我将 sqlQuery
中的 {hub}
作为 url 参数传递。
做一个像
这样的请求 https://<my-function-url>?code=<my-function-key>&hub=<my-hub-id>
returns 匹配的中心。
如果将值 <my-hub-id>
留空
https://<my-function-url>?code=<my-function-key>&hub=
returns 一个空对象。
问题是当我不在 URL 中提供 hub
参数时,函数崩溃。
https://<my-function-url>?code=<my-function-key>
要求以上returnshttp status code 500
不应该以某种方式处理丢失的查询参数吗?
谢谢
不,你应该处理那个。如果您查看 hello world 示例:
[FunctionName("HttpTriggerCSharp")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
HttpRequest req, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
它尝试从查询字符串和正文中读取值。如果它为空,它将 return
new BadRequestObjectResult("Please pass a name on the query string or in the request body")
所以你也应该这样做,以防查询字符串中没有提供集线器,return 400(错误请求)
看来 sql 会是
SELECT * FROM c WHERE c.uuid =
但不是
SELECT * FROM c WHERE c.uuid = "" or SELECT * FROM c WHERE c.uuid = null
当参数 "hub" 缺失时。
Azure 函数 cosmos db 绑定将不会处理查询中缺少的参数。如果你想处理这个错误,我想我们可以创建另一个 api 或函数,并将原始函数 url 放入(调用)这个新的 api/function 中。那么我们可以在新的api/function.
中处理这个错误如果您希望azure function添加此功能,可以将您的想法提出到azure function feedback页面。