Обработчик запросов функции на Node.js
Обработчик запросов — это метод, который используется для обработки каждого вызова функции на Node.js. При создании версии функции необходимо указать точку входа, которая состоит из имени файла и имени обработчика запросов (например, index.myFunction
). Чтобы обработчик был доступен вне модуля (файла), экспортируйте его, добавив ключ в объект module.exports
.
Примечание
В каждый момент времени один экземпляр функции обрабатывает не больше вызовов, чем задано в параметре concurrency. Это позволяет использовать глобальные переменные без необходимости обеспечивать контроль целостности данных.
При вызове обработчика среда выполнения передает следующие аргументы:
-
Тело запроса (параметр
body
).Если тело запроса — JSON-документ, то оно будет преобразовано в
Object
с помощью методаJSON.parse
. -
Контекст вызова (параметр
context
).Контекст содержит необходимую информацию о версии функции. Структура этого объекта описана в разделе Контекст вызова функции на Node.js.
Виды обработчика
Функция может обрабатывать один или несколько запросов одновременно, для этого используются синхронный и асинхронный обработчики соответственно.
Асинхронный обработчик
Обработчик может быть асинхронной функцией async function()
. В этом случае вы можете использовать следующие операторы:
return
— возвращает ответ функции.throw
— сообщает среде выполнения об ошибке.await
— отслеживает выполнение вызова асинхронных функций.
Примечание
Асинхронная функция должна возвращать непосредственный результат. Дополнительно использовать объект Promise
для отслеживания результата вызова не требуется, так как функция уже является асинхронной.
Подробнее о разработке с помощью async/await
читайте в Современном учебнике JavaScript
Синхронный обработчик
Если не требуется вызов асинхронных функций или есть необходимость использовать традиционную модель обратных вызовов, используйте синхронный обработчик.
Чтобы вернуть результат выполнения, используйте оператор 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
Примеры
Вывод структуры HTTP-запроса
Следующая функция выводит структуру запроса и контекста вызова одновременно и в журнал выполнения, и в ответ функции:
module.exports.handler = function (event, context) {
console.log("event", event);
console.log("context", context);
return {
statusCode: 200,
body: JSON.stringify({
event: event,
context: context
})
};
};
Асинхронный обработчик
Функция делает запрос к https://example.com/
и возвращает HTTP-код ответа и содержимое JSON-документа:
const fetch = require("node-fetch");
module.exports.handler = async function (event) {
const response = await fetch('https://example.com/');
const body = await response.text();
return {
code: response.status,
body: body
};
};
Синхронный обработчик
Функция возвращает подготовленный ответ или ошибку:
module.exports.handler = function () {
if (Math.random() >= 0.5) {
throw new Error("not so lucky");
}
return {
"message": "Lucky one!"
};
};