Azure函数TypeScript装饰器

时间:2019-03-22 12:42:41

标签: node.js typescript azure azure-functions

Recently Azure functions released support for 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 :(得分:0)

这是一个很好的问题!

装饰器基本上是包装应用它们的功能的函数。您可以在official doc中阅读有关其工作原理的更多信息。

现在进入Azure函数,打字稿函数实际上已编译为JavaScript,然后运行。因此,装饰器将开箱即用。 :)

  

请注意,您必须将experimentalDecorators文件中的tsconfig.json标志设置为true,才能按照docs

所述进行操作

这是您如何实现自己的自定义装饰器的简单示例

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'