Logo Aurabase
aurabasedocumenti
documenti›Edge Functions›Invoke a function

Richiamare una funzione

Come chiamare una funzione distribuita con l'SDK JavaScript o tramite HTTP e in che modo la tua funzione sa chi sta chiamando.

8 min letto·Livello intermedio·Revisionato il 12 ott 2026
Questo testo inglese è stato generato automaticamente dall'originale francese e non è stato ancora rivisto.
Questa pagina è stata tradotta automaticamente. Fa fede la versione inglese.
#
SDK

1. Chiama dall'SDK

invoke è l'unica chiamata che una chiave pubblica può effettuare. Funziona allo stesso modo in un browser e su un server.

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
// Dopo l'accesso, l'SDK aggiunge JWT dell'utente a ogni chiamata: nessun codice aggiuntivo.
await aura.auth.signInWithPassword({ email, password })
const { data } = await aura.functions.invoke('whoami')
// La funzione vede x-aura-role: authenticated e l'id dell'utente.

Il generico invoke<T> digita solo la risposta. Il nome e il corpo non vengono controllati in fase di compilazione.

Una chiave pubblica può solo invocare

list, get, listJobs, enqueueJob e gli altri metodi di gestione richiedono una chiave service_role e appartengono al tuo server. Una chiave pubblica riceve 403. Vedi chi può chiamare cosa.

#
Richiesta

2. Descrivi la richiesta

La tua funzione riceve esattamente la richiesta che descrivi, non un wrapper attorno ad essa.

OpzionePredefinitoCosa vede la funzione
methodPOSTreq.method
path/new URL(req.url).pathname
headersnessunoreq.headers, ad eccezione delle intestazioni della piattaforma elencate di seguito
bodynessunoawait req.json() (o req.text() per una stringa)
timeoutimpostazione predefinita del client (30 s)non visibile: annulla la chiamata
signalnessunonon visibile: annulla la chiamata
responseType'json'non visibile: come l'SDK decodifica la risposta, vedere risposte non 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)          // nome percorso: '/elementi/1'
  const source = req.headers.get('x-source') // 'cruscotto'
  const body = await req.json()         // {quantità: 2}
  return Response.json({ method: req.method, id: url.pathname.split('/').pop(), source, body })
})

Regole che vale la pena conoscere:

  • GET e HEAD vengono inviati senza corpo.
  • Un corpo che non è una stringa viene inviato come JSON, con content-type: application/json a meno che non ne imposti uno. Un corpo stringa viene inviato così com'è e riceve anche content-type: application/json, quindi leggilo con req.text().
  • Senza body, la funzione riceve una richiesta senza corpo. Un semplice await req.json() genera, quindi scrivi await req.json().catch(() => ({})) quando la chiamata può essere effettuata senza payload.
  • Il corpo deve essere JSON: un oggetto, un array, una stringa, un numero o un valore booleano. Un Blob, ArrayBuffer, array tipizzato, FormData, URLSearchParams o ReadableStream viene rifiutato con il codice di errore invalid_body prima che venga inviata qualsiasi richiesta.
  • Le intestazioni di frame (content-length, transfer-encoding, connection, host, …) vengono ignorate.
#
Identità

3. Leggere l'identità del chiamante

La piattaforma convalida la chiave e il token dell'utente prima dell'esecuzione della funzione, quindi aggiunge queste intestazioni:

IntestazioneValore
x-aura-roleanon, authenticated o service_role
x-aura-user-idL'ID dell'utente quando x-aura-role è authenticated, altrimenti assente
x-aura-project-idL'ID del progetto
authorizationJWT dell'utente, solo per un utente che ha effettuato l'accesso
apikeyIl tasto utilizzato per la chiamata
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') })
})

Risultati reali di questa chiamata con tre chiavi diverse:

results.jsonjson
{ "role": "anon",          "userId": null }
{ "role": "authenticated", "userId": "b125f8cd-ddc8-4042-9d9d-2e0aa3cebe51" }
{ "role": "service_role",  "userId": null }
Un chiamante non può falsificare queste intestazioni

La piattaforma scarta authorization, apikey, x-request-id e ogni intestazione x-aura-* che un chiamante inserisce headers, qualunque sia il caso. Solo i valori verificati raggiungono la tua funzione. Altre intestazioni personalizzate passano senza modifiche.

Nessun ID richiesta all'interno della funzione

Il x-request-id della chiamata non viene inoltrato alla tua funzione. Per correlare una chiamata con una riga di registro, genera il tuo ID, invialo in headers e registralo nella funzione.

#
HTTP

4. Chiamata tramite HTTP

Senza l'SDK, invia un oggetto JSON che descriva la richiesta. Il campo body è ciò che riceve la tua funzione.

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

Sono richiesti sia apikey che Content-Type: application/json. Aggiungi Authorization: Bearer <user JWT> per chiamare come utente registrato. La risposta predefinita è una busta; l'intestazione X-Aurabase-Invoke-Mode: raw restituisce invece la risposta della funzione, vedere risposte non JSON.

#
Risultato

5. Leggi il risultato

invoke non lancia mai. Restituisce { data, error }:

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

if (error) {
  // error.status: stato HTTP dell'errore
  // error.message: il testo restituito dalla funzione o la spiegazione della piattaforma
  return
}
// i dati sono nulli quando la funzione non ha restituito alcun contenuto (ad esempio un 204)
if (data === null) return
console.log(data)

Prova data anziché error quando ti serve il valore: TypeScript quindi saprai che non è null. Per gestire gli errori in modo preciso, leggere errori, timeout e nuovi tentativi.

Ultimo aggiornamento · 12 ott 2026