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.
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.
Il generico invoke<T> digita solo la risposta. Il nome e il corpo non vengono controllati in fase di compilazione.
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.
2. Descrivi la richiesta
La tua funzione riceve esattamente la richiesta che descrivi, non un wrapper attorno ad essa.
| Opzione | Predefinito | Cosa vede la funzione |
|---|---|---|
method | POST | req.method |
path | / | new URL(req.url).pathname |
headers | nessuno | req.headers, ad eccezione delle intestazioni della piattaforma elencate di seguito |
body | nessuno | await req.json() (o req.text() per una stringa) |
timeout | impostazione predefinita del client (30 s) | non visibile: annulla la chiamata |
signal | nessuno | non visibile: annulla la chiamata |
responseType | 'json' | non visibile: come l'SDK decodifica la risposta, vedere risposte non JSON |
Regole che vale la pena conoscere:
GETeHEADvengono inviati senza corpo.- Un corpo che non è una stringa viene inviato come JSON, con
content-type: application/jsona meno che non ne imposti uno. Un corpo stringa viene inviato così com'è e riceve anchecontent-type: application/json, quindi leggilo conreq.text(). - Senza
body, la funzione riceve una richiesta senza corpo. Un sempliceawait req.json()genera, quindi scriviawait 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,URLSearchParamsoReadableStreamviene rifiutato con il codice di erroreinvalid_bodyprima che venga inviata qualsiasi richiesta. - Le intestazioni di frame (
content-length,transfer-encoding,connection,host, …) vengono ignorate.
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:
| Intestazione | Valore |
|---|---|
x-aura-role | anon, authenticated o service_role |
x-aura-user-id | L'ID dell'utente quando x-aura-role è authenticated, altrimenti assente |
x-aura-project-id | L'ID del progetto |
authorization | JWT dell'utente, solo per un utente che ha effettuato l'accesso |
apikey | Il tasto utilizzato per la chiamata |
Risultati reali di questa chiamata con tre chiavi diverse:
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.
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.
4. Chiamata tramite HTTP
Senza l'SDK, invia un oggetto JSON che descriva la richiesta. Il campo body è ciò che riceve la tua funzione.
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.
5. Leggi il risultato
invoke non lancia mai. Restituisce { data, error }:
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.