Azure Функция падает при пропущенном URL-запросе - PullRequest
0 голосов
/ 18 января 2020

У меня есть Azure -функция со следующей конфигурацией

{
  "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
}

Как вы можете видеть выше, у меня {hub} в sqlQuery передается в качестве параметра url.

Выполнение запроса, например

    https://<my-function-url>?code=<my-function-key>&hub=<my-hub-id>

, возвращает соответствующий концентратор.

Если оставить значение <my-hub-id> пустым

    https://<my-function-url>?code=<my-function-key>&hub=

возвращает пустой объект.

Проблема заключается в том, что я не предоставляю параметр hub в URL-адресе, при котором происходит сбой функции.

    https://<my-function-url>?code=<my-function-key>

, запрашивающий вышеуказанное, возвращает http status code 500

Shouldn Не пропущены ли параметры запроса каким-либо образом?

Спасибо

Ответы [ 2 ]

1 голос
/ 20 января 2020

Кажется, что sql будет

SELECT * FROM c WHERE c.uuid =

, но не

SELECT * FROM c WHERE c.uuid = "" or SELECT * FROM c WHERE c.uuid = null

, когда параметр "концентратор" отсутствует.

Azure функция cosmos Привязка БД не будет обрабатывать отсутствующий параметр в запросе. Если вы хотите обработать эту ошибку, я думаю, что мы можем создать другой API или функцию и поместить (вызвать) исходный URL функции в эту новую API / функцию. Затем мы можем обработать эту ошибку в новой API / функции.

Если вы надеетесь, что функция azure добавит эту функцию, вы можете поднять свою идею до страницы azure function feedback .

0 голосов
/ 18 января 2020

Нет, вы должны справиться с этим. Если вы проверите пример 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");
}

Он пытается прочитать значение из строки запроса и из тела. В случае нулевого значения он вернет

new BadRequestObjectResult("Please pass a name on the query string or in the request body")

, поэтому вы должны сделать то же самое, если в строке запроса нет концентратора, вернуть 400 (неверный запрос)

...