Доступ к дополнительным свойствам в привязке в Azure контексте функции - PullRequest
0 голосов
/ 07 мая 2020

Я пишу Azure Функции в TypeScript. Я хочу улучшить один из классов функций TypeScript, Context. Azure Функции объявляют триггеры, ввод и вывод в конфигурационном файле json.

Вот пример привязки:

{
  "name": "shipmentDocumentOut",
  "type": "cosmosDB",
  "databaseName": "dev",
  "collectionName": "shipment",
  "createIfNotExists": false,
  "connectionStringSetting": "COSMOSDB_CONNECTION_STRING",
  "direction": "out"
}

Привязки загружаются средой выполнения функции и являются затем доступен для объекта Context при запуске:

const updatePackageTrigger: AzureFunction = async function (context: Context): Promise<void> {
    const index = context.bindingDefinitions.findIndex(def => def.name === "shipmentDocumentOut")
    context.bindingDefinitions[index]
    ...
}

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

export interface Context {
    bindingDefinitions: BindingDefinition[];
}

export interface BindingDefinition {
    name: string;
    type: string;
    direction: 'in' | 'out' | 'inout' | undefined;
}

Я попытался расширить контекст согласно руководству I найдено, но при его использовании возникает ошибка:

interface BindingContext extends Context {
    bindings: {
        shipmentDocumentOut: {
            collectionName: string,
            databaseName: string
        }
    };
}

// Causes:
Type '(context: BindingContext, packageEvents: PackageEvent[]) => Promise<void>' is not assignable to type 'AzureFunction'.
  Types of parameters 'context' and 'context' are incompatible.
    Type 'Context' is not assignable to type 'BindingContext'.
      Types of property 'bindings' are incompatible.
        Property 'shipmentDocumentOut' is missing in type '{ [key: string]: any; }' but required in type '{ shipmentDocumentOut: { collectionName: string; databaseName: string; }; }'

Как я могу получить доступ к свойствам в настроенной привязке? Я предполагаю, что среда выполнения функции использует эти свойства где-то под капотом для подключения к базе данных.

1 Ответ

0 голосов
/ 15 мая 2020

Контекст предоставляет свой каталог выполнения во время выполнения, поэтому я решил это следующим образом:

export class FunctionUtil {

    private static readonly _functionFileName = "function.json";

    static async getBindingByName(functionFileDirectory: string, bindingName: string) {
        const functionJson = await FileUtil.readFileAsync(`${functionFileDirectory}/${this._functionFileName}`, "UTF-8")
        return functionJson.bindings.find((binding: { name: string }) => binding.name === bindingName)
    }
}

Для вызова утилиты:

const binding = await FunctionUtil.getBindingByName(context.executionContext.functionDirectory, "bindingName")
...