Я создаю 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:
- Установите все необходимые пакеты локально, запустив npm install.
- Разверните свой код и убедитесь, что папка 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"
}
]
}
Я не могу понять, что здесь не так. Будем очень признательны за любые указатели в правильном направлении.