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装饰器将是最好,最干净的选择,但不确定实现方式。

最佳答案

这是一个很好的问题!

装饰器基本上是包装应用它们的功能的函数。您可以在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'

关于node.js - Azure函数TypeScript装饰器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55299880/

10-16 07:22