[Документация Yandex Cloud](../../../index.md) > [Yandex Cloud Functions](../../index.md) > [Разработка на Node.js](index.md) > Обработчик запросов

# Обработчик запросов функции на Node.js

_Обработчик запросов_ — это метод, который используется для обработки каждого вызова функции на Node.js. При создании версии функции необходимо указать точку входа, которая состоит из имени файла и имени обработчика запросов (например, `index.myFunction`). Чтобы обработчик был доступен вне модуля (файла), экспортируйте его, добавив ключ в объект `module.exports`.

{% note info %}

В каждый момент времени один экземпляр функции обрабатывает не больше вызовов, чем задано в параметре [concurrency](../../concepts/function.md#concurrency). Это позволяет использовать глобальные переменные без необходимости обеспечивать контроль целостности данных.

{% endnote %}

При вызове обработчика среда выполнения передает следующие аргументы:
1. Тело запроса (параметр `body`). 

    Если тело запроса — JSON-документ, то оно будет преобразовано в `Object` с помощью метода `JSON.parse`.
1. Контекст вызова (параметр `context`). 

    Контекст содержит необходимую информацию о версии функции. Структура этого объекта описана в разделе [Контекст вызова функции на Node.js](context.md).
    
## Виды обработчика {#type}

Функция может обрабатывать один или несколько запросов одновременно, для этого используются синхронный и асинхронный обработчики соответственно.

## Асинхронный обработчик {#async}

Обработчик может быть асинхронной функцией `async function()`. В этом случае вы можете использовать следующие операторы: 
* `return` — возвращает ответ функции.
* `throw` — сообщает среде выполнения об ошибке.
* `await` — отслеживает выполнение вызова асинхронных функций.

{% note info %}

Асинхронная функция должна возвращать непосредственный результат. Дополнительно использовать объект `Promise` для отслеживания результата вызова не требуется, так как функция уже является асинхронной.

{% endnote %}

Подробнее о разработке с помощью `async/await` читайте в [Современном учебнике JavaScript](https://learn.javascript.ru/async-await).

## Синхронный обработчик {#sync}

Если не требуется вызов асинхронных функций или есть необходимость использовать традиционную модель обратных вызовов, используйте синхронный обработчик.

Чтобы вернуть результат выполнения, используйте оператор `return` или сигнализируйте об исключении с помощью оператора `throw`. Синхронная функция обязана возвращать результат, отличный от `undefined`, иначе код будет выполнен с ошибкой `Non-async entry point should provide a result. Return a value or use async function instead`.

При этом, если обработчик вернет экземпляр объекта `Promise`, то среда выполнения автоматически дождется результата обработки этого объекта. При работе с объектом `Promise` корректная обработка ошибок и исключений зависит от кода вашей функции. Убедитесь, что: 
* Один из обратных вызовов функции (`resolve` или `reject`), который выполняется внутри объекта `Promise`, обязательно будет выполнен. 
* Все исключения в теле функции корректно обработаны. 
В противном случае выполнение кода будет нарушено (функция перестанет реагировать на вызовы, или весь процесс будет завершен с ошибкой).

Подробнее о разработке с помощью `Promise` читайте в [Современном учебнике JavaScript](https://learn.javascript.ru/promise-basics).

## Примеры {#examples}

### Вывод структуры HTTP-запроса {#http-req}

Следующая функция выводит структуру запроса и контекста вызова одновременно и в журнал выполнения, и в ответ функции:

```js
module.exports.handler = function (event, context) {
    console.log("event", event);
    console.log("context", context);
    
    return {
        statusCode: 200,
        body: JSON.stringify({
            event: event,
            context: context
        })
    };
};
```

### Асинхронный обработчик {#async-example}

Функция делает запрос к `https://example.com/` и возвращает HTTP-код ответа и содержимое JSON-документа:

```js
module.exports.handler = async function (event) {
    
    const response = await fetch('https://example.com/');
    const body     = await response.text();
    
    return {
        code: response.status,
        body: body
    };
    
};
```

### Синхронный обработчик {#sync-example}

Функция возвращает подготовленный ответ или ошибку:

```js
module.exports.handler = function () {
    if (Math.random() >= 0.5) {
        throw new Error("not so lucky");
    }

    return {
        "message": "Lucky one!"
    };
};
```