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