Функции Azure TypeScript декоратор - PullRequest
0 голосов
/ 22 марта 2019

Недавно функции Azure выпустили поддержку TypeScript :

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

@some_decorator - ???
const httpTrigger: AzureFunction = async function (context: Context, 
req: HttpRequest): Promise<void> {       

}

export default httpTrigger;

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

Мне интересно, какие декораторы TypeScript были бы наилучшим и наиболее чистым вариантом, но не уверены в реализации.

1 Ответ

0 голосов
/ 26 марта 2019

Отличный вопрос!

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

Теперь перейдя к функциям Azure, функции машинописи на самом деле компилируются в JavaScript и затем запускаются. Итак, декораторы будут работать из коробки. :)

Обратите внимание, что вам нужно установить для флага experimentalDecorators в файле tsconfig.json значение true, чтобы это работало, как указано в документах

Вот простой пример того, как вы можете реализовать свой собственный декоратор

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

function checkUserId(userId: string) {
  return function(
    target: Object,
    propertyKey: string,
    descriptor: PropertyDescriptor
  ) {
    const originalValue = descriptor.value;

    descriptor.value = async function(...args: any[]) {
      const context: Context = args[0];
      const req: HttpRequest = args[1];

      if (req.headers['x-func-user-id'] !== userId) {
        context.res = {
          status: 403,
          body: 'User not authorized!'
        };
        return;
      }

      // Call the original function
      await originalValue.apply(this, args);
      return;
    };
  };
}

class HttpTrigger {
  @checkUserId('azure-user')
  static 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);

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

export default HttpTrigger.function;

И вы можете проверить эту функцию следующим образом

curl --request GET \
  --url 'http://localhost:7071/api/HttpTrigger?name=Azure' \
  --header 'x-func-user-id: azure-user'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...