Отличный вопрос!
Декораторы - это, в основном, функции, которые оборачивают функцию, к которой они применяются. Вы можете прочитать больше о том, как они работают, в их официальном документе .
Теперь перейдя к функциям 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'