Azure Запись функции в CosmosDB и обработка ошибок - PullRequest
1 голос
/ 20 апреля 2020

Я написал Azure функцию, которая сохраняет данные в коллекцию Cosmos:

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    try {
        if (req.body) {
            const body: Body = req.body

            context.bindings.cosmosDocument = JSON.stringify(body);
            context.res = {
                status: 200,
                body: 'Successfully persisted document'
            };
        }
    } catch (error) {
        context.res = {
            status: 400,
            body: 'Colliding id'
        }
    }
}

Я обрабатываю ошибки в соответствии с документацией .

Мой Полезная нагрузка выглядит следующим образом:

{
    "shipmentId": "shipmentId",
    "timestamp": 1586327829354,
    "totalVolume": 1,
    "totalWeight": 1,
    "packages": [{
        "packageId": "courierPackageId",
        "shipmentId": "shipmentId",
        "weight:": 1000,
        "dimensions": {
            "length": 100,
            "width": 100,
            "height": 100
        }
    }]
}

Однако, когда я пытаюсь сохранить в базе данных что-то, имеющее конфликтующий идентификатор, эта ошибка не обнаруживается.

Я вижу следующую ошибку:

Объект с указанным идентификатором уже существует в системе

И когда я вызываю этот триггер через Почтальон, я получаю статус 500 и никакого тела сообщения.

В этой проблеме на Github предлагается решение для C#.

Как я могу обработать это исключение и дать пользователю API осмысленное сообщение? Каков обычный подход при построении API в Azure Функция и обработка ошибок, вызванных привязками вывода?

1 Ответ

1 голос
/ 21 апреля 2020

С моей стороны все работает нормально. Я могу загрузить, а также обновить.

Это код моего функционального приложения:

index.ts:

import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');
    const name = (req.query.name || (req.body && req.body.name));

    try {
        if (req.body) {
            const body: Body = req.body

            context.bindings.employeeDocument = JSON.stringify(body);
            context.res = {
                status: 200,
                body: 'Successfully persisted document'
            };
        }
    } catch (error) {
        context.res = {
            status: 400,
            body: 'Colliding id'
        }
    }

    if (name) {
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

export default httpTrigger;

функция. json:

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "name": "employeeDocument",
      "type": "cosmosDB",
      "databaseName": "ToDoList",
      "collectionName": "Items",
      "createIfNotExists": true,
      "connectionStringSetting": "MyAccount_COSMOSDB",
      "direction": "out"
    }
  ],
  "scriptFile": "../dist/HttpTrigger1/index.js"
}

И это почтальон: (Я поместил файл json в test.txt)

enter image description here

test.txt:

{
    "id": "934a2153-fdb1-40e3-9e90-61c43fcef220",
    "shipmentId": "shipmentId2",
    "timestamp": 1586327829354,
    "totalVolume": 1,
    "totalWeight": 1,
    "packages": [{
        "packageId": "courierPackageId",
        "shipmentId": "shipmentId",
        "weight:": 1000,
        "dimensions": {
            "length": 100,
            "width": 100,
            "height": 100
        }
    }]
}

В случае того же идентификатора, если вы измените другие детали и затем активируете функцию, azure cosmosdb будет соответственно обновлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...