Azure Функция: Не могу понять, к какому клиенту обратиться - PullRequest
1 голос
/ 08 мая 2020

Я создаю API, который публикуется для Azure функций. В настоящее время у меня есть две рабочие функции, и я написал третью, которую не могу заставить работать после развертывания.

Он работает при локальном запуске с использованием func start и указывает scriptFile в function.json на тот же транспилированный файл, который я развертываю в Azure.

Это то, что содержимое выглядят так, когда я загружаю их из среды выполнения функции:

├── host.json
├── node_modules/
├── FunctionA
│   ├── function.json
│   ├── index.js
│   └── index.js.map
├── proxies.json
├── FunctionB
│   ├── function.json
│   ├── index.js
│   └── index.js.map
└── FunctionC
    ├── function.json
    ├── index.js
    └── index.js.map

FunctionA и FunctionB работают. Основное отличие FunctionC заключается в том, что эта функция имеет зависимость от node_modules зависимости, @azure/cosmos.

Я строю все свои функции одинаково, npx parcel build index.ts --target node. Согласно документам посылки:

Целевой узел и электрон не будут связывать пакет. json зависимости

Именно то, что я хочу, поскольку разработчик В рекомендациях указано, как вы обрабатываете зависимости в функции Azure, используя Javascript:

  1. Установите все необходимые пакеты локально, запустив npm install.
  2. Разверните свой код и убедитесь, что папка node_modules включена в развертывание.

Предоставляемая мной папка node_modules является результатом выполнения npm install --production, поскольку я не Мне нужны другие зависимости.

Но когда я go проверяю эту функцию в Azure Portal, я вижу следующую ошибку при входе в представление кода:

Function ( Функция C) Ошибка: не могу понять, какой ctor вызвать.

Сама функция в TypeScript выглядит так:

// Omitted imports
const functionC: AzureFunction = async function (context: Context, events: CustomEvent[]): Promise<void> {
    try {
        // Extract data about Cosmos database and container
        const cosmosOutBinding = await FunctionUtil.getBindingByName(context.executionContext.functionDirectory, "documentOut")

        const cosmosConnection: CosmosDB = new CosmosDB(process.env.COSMOSDB_CONNECTION_STRING, cosmosOutBinding.databaseName)
        const updateContext: UpdateContext = new UpdateContext(context, cosmosConnection, cosmosOutBinding.collectionName)

        await updateContext.handleEvents(events)
    } catch (error) {
        context.log.error('Failed', error)
    }
}

export default functionC

UpdateContext - это импортированный класс, содержащий основные логические c функции. Я структурировал его таким образом, чтобы его можно было тестировать.

И, наконец, привязки для этой функции:

{
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "events",
      "direction": "in",
      "eventHubName": "some-hub",
      "connection": "EVENT_HUB_CONNECTION_STRING",
      "cardinality": "many",
      "consumerGroup": "events"
    },
    {
      "name": "documentOut",
      "type": "cosmosDB",
      "databaseName": "dev",
      "collectionName": "asdf",
      "createIfNotExists": false,
      "connectionStringSetting": "COSMOSDB_CONNECTION_STRING",
      "direction": "out"
    }
  ]
}

Я не могу понять, что здесь не так. Будем очень признательны за любые указатели в правильном направлении.

1 Ответ

1 голос
/ 11 мая 2020

Мы создаем нашу инфраструктуру, используя terraform и terraform по умолчанию для версии 1 среды выполнения функции. Я создал новое приложение-функцию на портале, и по умолчанию оно равно 3. Развертывание в созданной вручную среде выполнения работает.

...