Выходная привязка CosmosDB не обновляет базу данных - PullRequest
0 голосов
/ 07 апреля 2020

В проекте функций TypeScript я создал триггерную функцию HTTP, которая считывает данные элемента из CosmosDB с использованием привязки ввода и пытается обновить элементы с использованием привязки вывода.

Ожидаемый поток:

HTTP-триггер -> выполнение функции и чтение элемента из БД через привязку ввода -> обновить или создать элемент через привязку вывода -> возврат HTTP-ответа (JSON)

Код функции:

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest, productItem: any, productToUpdate: any): Promise<void> {
    context.log('HTTP trigger function processed a request.');

    productToUpdate = JSON.stringify({
        "id" : productItem.id,
        "name" : "Changed by output binding"
    })

    context.res = {
        status: 200,
        body: {
            id: context.bindingData.productId,
            name: "Updated product"
        }
    };

};

Если я вызову функцию на /api/products/1234, она будет выполнена правильно, и productItem будет считано из моей БД и содержит информацию об элементе с идентификатором "1234":

enter image description here

Изменение на productToUpdate, однако, не имеет никакого эффекта. Содержимое БД остается без изменений. Я пытался использовать как JSON.stringify(), так и обычный объект { "id": ... }.

Нет сообщений об ошибках и указаний на сбой операции. Что я делаю неправильно? Как я могу отладить эту проблему?

Для справки, вот моя обязательная информация в функции. json:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ],
      "route": "product/{productId}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "cosmosDB",
      "direction": "in",
      "name": "productItem",
      "databaseName": "maindb",
      "collectionName": "products",
      "connectionStringSetting": "CosmosDbConnectionString",
      "id": "{productId}",
      "partitionKey": "{productId}"
    },
    {
      "type": "cosmosDB",
      "direction": "out",
      "name": "productToUpdate",
      "databaseName": "maindb",
      "collectionName": "products",
      "createIfNotExists": "false",
      "connectionStringSetting": "CosmosDbConnectionString"
    }
  ],
  "scriptFile": "../dist/products/index.js"
}

1 Ответ

0 голосов
/ 08 апреля 2020

Нашел ответ после некоторой попытки. Существуют разные способы работы с привязками. Они объяснены здесь в JavaScript документах для Azure функций. Часть о «выходных» привязках относится к этому случаю:

[Рекомендуется для нескольких выходов] Возвращение объекта. Если вы используете функцию возврата асинхронных / Promise, вы можете вернуть объект с назначенными выходными данными. В приведенном ниже примере выходные привязки называются «httpResponse» и «queueOutput» в функции. json.

И приведен пример, когда функция, запускаемая HTTP, возвращает ответ и обновляет элемент очереди. Для моего сценария оператор return должен выглядеть следующим образом:

return {
    res : {
        status: 200,
        body: {
            id: context.bindingData.productId,
            name: "Updated product"
        }
    },
    productToUpdate : {
        "id": productItem.id,
        "name": "Updated by TS client " + Date.now()
    }
}

Из коробки это не работает для версии TypeScript, потому что функция TS возвращает Promise<void>. Это должно быть изменено на Promise<any>.

Я также рекомендую не полагаться на сопоставление параметров для привязок и использовать вместо этого context.bindings. Привязки сопоставляются с параметрами в порядке , они появляются в функции. json (имена привязок не имеют значения). Тем не менее, привязки output не могут быть успешно сопоставлены - или лучше: они сопоставлены, но их установка не действует в асинхронных c функциях. Чтобы избежать путаницы, я думаю, что полагаться на context.bindings для всех привязок - лучший вариант.

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