Логотип Аурабаза
аурабазадокументы
документы›Edge Functions›Invoke a function

Вызов функции

Как вызвать развернутую функцию с помощью JavaScript SDK или через HTTP и как ваша функция узнает, кто вызывает.

8 мин читать·Уровень средний·Пересмотрено 12 окт. 2026 г.
Этот текст на английском языке был создан автоматически на основе французского оригинала и еще не проверялся.
Эта страница была переведена автоматически. Английская версия является авторитетной.
#
SDK

1. Вызов из SDK

invoke — единственный вызов, который может сделать открытый ключ. Это работает одинаково в браузере и на сервере.

src/lib/call.tstypescript
import { createClient } from '@aurabase/aurabase-js'

const aura = createClient(process.env.AURA_URL!, process.env.AURA_ANON_KEY!)

const { data, error } = await aura.functions.invoke<{ greeting: string }>('hello', {
  body: { name: 'Ada' },
})
if (error) throw error
console.log(data?.greeting)
src/lib/call-as-user.tstypescript
// После входа в систему SDK добавляет JWT пользователя к каждому вызову: никакого дополнительного кода.
await aura.auth.signInWithPassword({ email, password })
const { data } = await aura.functions.invoke('whoami')
// Функция видит x-aura-role: аутентифицированный и идентификатор пользователя.

Общий invoke<T> только печатает ответ. Имя и тело не проверяются во время компиляции.

Открытый ключ может вызывать только

list, get, listJobs, enqueueJob и другим методам управления требуется ключ service_role, и они принадлежат вашему серверу. Открытый ключ получает 403. См. , кто что может вызывать.

#
Запрос

2. Опишите запрос

Ваша функция получает именно запроса, который вы описываете, а не обертку вокруг него.

ВариантПо умолчаниюЧто видит функция
methodPOSTreq.method
path/new URL(req.url).pathname
headersниктоreq.headers, за исключением заголовков платформы, перечисленных ниже.
bodyниктоawait req.json() (или req.text() для строки)
timeoutклиент по умолчанию (30 с)не видно: отменяет ваш звонок
signalниктоне видно: отменяет ваш звонок
responseType'json'не видно: как SDK декодирует ответ, см. ответы, отличные от JSON
request.tstypescript
await aura.functions.invoke('items', {
  method: 'PUT',
  path: '/items/1',
  headers: { 'x-source': 'dashboard' },
  body: { qty: 2 },
})
aurabase/functions/items/index.tstypescript
Deno.serve(async (req) => {
  const url = new URL(req.url)          // путь: '/items/1'
  const source = req.headers.get('x-source') // 'приборная панель'
  const body = await req.json()         // { кол-во: 2 }
  return Response.json({ method: req.method, id: url.pathname.split('/').pop(), source, body })
})

Правила, которые стоит знать:

  • 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-roleanon, authenticated или service_role
x-aura-user-idИдентификатор пользователя, когда x-aura-role равен authenticated, в противном случае отсутствует.
x-aura-project-idИдентификатор проекта
authorizationJWT пользователя, только для вошедшего в систему пользователя.
apikeyКлюч, используемый для вызова
aurabase/functions/whoami/index.tstypescript
Deno.serve((req) => {
  if (req.headers.get('x-aura-role') !== 'authenticated') {
    return new Response('Sign in first', { status: 401 })
  }
  return Response.json({ userId: req.headers.get('x-aura-user-id') })
})

Реальные результаты этого звонка с тремя разными ключами:

results.jsonjson
{ "role": "anon",          "userId": null }
{ "role": "authenticated", "userId": "b125f8cd-ddc8-4042-9d9d-2e0aa3cebe51" }
{ "role": "service_role",  "userId": null }
Вызывающий абонент не может подделать эти заголовки

Платформа отбрасывает authorization, apikey, x-request-id и каждый заголовок x-aura-*, который вызывающий объект помещает в headers, независимо от их случая. Только те значения, которые он сам проверил, достигают вашей функции. Другие пользовательские заголовки проходят без изменений.

Нет идентификатора запроса внутри функции

x-request-id вызова не перенаправляется в вашу функцию. Чтобы сопоставить вызов со строкой журнала, сгенерируйте свой собственный идентификатор, отправьте его в headers и зарегистрируйте в функции.

#
HTTP

4. Вызов через HTTP

Без SDK отправьте объект JSON, описывающий запрос. Поле body — это то, что получает ваша функция.

terminalbash
curl -X POST "$AURA_URL/v1/functions/hello/invoke" \
  -H "apikey: $AURA_ANON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":{"name":"Ada"}}'

Оба apikey и Content-Type: application/json являются обязательными. Добавьте Authorization: Bearer <user JWT> для вызова от имени вошедшего в систему пользователя. Ответом по умолчанию является конверт; вместо этого заголовок X-Aurabase-Invoke-Mode: raw возвращает собственный ответ вашей функции, см. ответы , отличные от JSON,.

#
Результат

5. Прочитайте результат

invoke никогда не выдает. Он возвращает { data, error }:

result.tstypescript
const { data, error } = await aura.functions.invoke('hello', { body: { name: 'Ada' } })

if (error) {
  // error.status: HTTP-статус ошибки.
  // error.message: текст, возвращенный вашей функцией, или объяснение платформы.
  return
}
// данные имеют значение null, если функция не вернула содержимого (например, 204)
if (data === null) return
console.log(data)

Проверяйте data вместо error, когда вам нужно значение: TypeScript тогда знает, что это не null. Чтобы точно обрабатывать сбои, прочтите ошибки, тайм-ауты и повторные попытки.

Последнее обновление · 12 окт. 2026 г.