Вызов функции
Как вызвать развернутую функцию с помощью JavaScript SDK или через HTTP и как ваша функция узнает, кто вызывает.
1. Вызов из SDK
invoke — единственный вызов, который может сделать открытый ключ. Это работает одинаково в браузере и на сервере.
Общий invoke<T> только печатает ответ. Имя и тело не проверяются во время компиляции.
list, get, listJobs, enqueueJob и другим методам управления требуется ключ service_role, и они принадлежат вашему серверу. Открытый ключ получает 403. См. , кто что может вызывать.
2. Опишите запрос
Ваша функция получает именно запроса, который вы описываете, а не обертку вокруг него.
| Вариант | По умолчанию | Что видит функция |
|---|---|---|
method | POST | req.method |
path | / | new URL(req.url).pathname |
headers | никто | req.headers, за исключением заголовков платформы, перечисленных ниже. |
body | никто | await req.json() (или req.text() для строки) |
timeout | клиент по умолчанию (30 с) | не видно: отменяет ваш звонок |
signal | никто | не видно: отменяет ваш звонок |
responseType | 'json' | не видно: как SDK декодирует ответ, см. ответы, отличные от JSON |
Правила, которые стоит знать:
GETиHEADотправляются без тела.- Тело, не являющееся строкой, отправляется в формате JSON с
content-type: application/json, если вы его не установили. Тело строки отправляется как есть и также получаетcontent-type: application/json, поэтому читайте его с помощьюreq.text(). - Без
bodyфункция получает запрос без тела. Выдает простойawait req.json(), поэтому пишитеawait req.json().catch(() => ({})), когда вызов может быть выполнен без полезной нагрузки. - Тело должно быть в формате JSON: объект, массив, строка, число или логическое значение. Типизированный массив
Blob,ArrayBuffer,FormData,URLSearchParamsилиReadableStreamотклоняется с кодом ошибкиinvalid_bodyперед отправкой любого запроса. - Заголовки кадра (
content-length,transfer-encoding,connection,host, …) игнорируются.
3. Прочитайте личность звонящего
Платформа проверяет ключ и токен пользователя перед запуском вашей функции, а затем добавляет следующие заголовки:
| Заголовок | Ценить |
|---|---|
x-aura-role | anon, authenticated или service_role |
x-aura-user-id | Идентификатор пользователя, когда x-aura-role равен authenticated, в противном случае отсутствует. |
x-aura-project-id | Идентификатор проекта |
authorization | JWT пользователя, только для вошедшего в систему пользователя. |
apikey | Ключ, используемый для вызова |
Реальные результаты этого звонка с тремя разными ключами:
Платформа отбрасывает authorization, apikey, x-request-id и каждый заголовок x-aura-*, который вызывающий объект помещает в headers, независимо от их случая. Только те значения, которые он сам проверил, достигают вашей функции. Другие пользовательские заголовки проходят без изменений.
x-request-id вызова не перенаправляется в вашу функцию. Чтобы сопоставить вызов со строкой журнала, сгенерируйте свой собственный идентификатор, отправьте его в headers и зарегистрируйте в функции.
4. Вызов через HTTP
Без SDK отправьте объект JSON, описывающий запрос. Поле body — это то, что получает ваша функция.
Оба apikey и Content-Type: application/json являются обязательными. Добавьте Authorization: Bearer <user JWT> для вызова от имени вошедшего в систему пользователя. Ответом по умолчанию является конверт; вместо этого заголовок X-Aurabase-Invoke-Mode: raw возвращает собственный ответ вашей функции, см. ответы , отличные от JSON,.
5. Прочитайте результат
invoke никогда не выдает. Он возвращает { data, error }:
Проверяйте data вместо error, когда вам нужно значение: TypeScript тогда знает, что это не null. Чтобы точно обрабатывать сбои, прочтите ошибки, тайм-ауты и повторные попытки.