Opzioni client, errori, tentativi e timeout
Il comportamento condiviso da ogni servizio dell'SDK e le opzioni che lo modificano.
1. Creare il cliente
createClient(url, key, options?) accetta l'URL del progetto e una chiave. Il progetto è identificato dall'host dell'URL, quindi non c'è alcun ID progetto da passare. In uno stack locale, utilizza un URL con il sottodominio del progetto, ad esempio http://my-app-ab12.localhost:8080; con un semplice http://localhost:8080 il client stampa un avviso, perché il gateway non può dire a quale progetto ti riferisci.
Utilizza la chiave pubblica (aura_anon_…) nei browser e nelle app. Una chiave service_role (aura_sk_…) appartiene solo al tuo server e il client la applica:
In un browser, createClient genera quando riceve una chiave service_role, quindi una chiave trapelata non può essere spedita per sbaglio. Imposta refuseServiceRoleInBrowser: false per declassare l'errore a avviso; non farlo in produzione.
Ogni servizio si blocca dal client: aura.auth, aura.db, aura.storage, aura.realtime, aura.functions, aura.ai, aura.notifications e aura.from('table') come scorciatoia per aura.db.from('table'). Vedi il riferimento del client.
2. Opzioni
| Opzione | Predefinito | Effetto |
|---|---|---|
auth.persistSession | true in un browser | Mantieni la sessione tra i caricamenti della pagina |
auth.storage | localStorage in un browser, memoria altrove | Dove risiede la sessione: passa il tuo negozio (cookie per SSR) |
auth.autoRefresh | true | Aggiorna il token di accesso prima che scada e mantieni le schede sincronizzate |
auth.detectSessionInUrl | true in un browser | Leggere una sessione dall'URL dopo un reindirizzamento OAuth, quindi pulire l'URL |
fetch | globalThis.fetch | Il tuo fetch, per test o proxy |
retry | true | Riprovare a leggere gli errori temporanei. false disabilita o { enabled, maxRetries } |
requestTimeoutMs | 30000 | Limite temporale di una richiesta. 0 lo disabilita. |
onEvent | nessuno | Riceve eventi di osservabilità, vedere di seguito |
debug | false | Stampa anche ogni evento con console.debug('[aurabase]', event) |
refuseServiceRoleInBrowser | true | Lanciato quando una chiave service_role raggiunge un browser |
Per il rendering lato server, utilizzare i client basati su cookie descritti in Next.js App Router e SSR.
3. L'oggetto errore
Ogni chiamata restituisce { data, error } e non genera mai un'eccezione. Quando fallisce, error è un AuraError:
È stata restituita una vera chiamata fallita:
| Campo | Significato |
|---|---|
status | Lo stato HTTP. 0 significa che l'errore si è verificato prima di qualsiasi risposta: rete, timeout o rifiuto da parte del client. |
code | Un identificatore stabile. I codici server mantengono il loro valore; il cliente aggiunge i codici seguenti. |
message | Una spiegazione leggibile |
details | Il corpo della risposta grezza |
retryAfter | Secondi di attesa, da un'intestazione Retry-After, su 429 |
isNotFound, isUnauthorized, isForbidden, isRateLimited | Scorciatoie su status |
Codici prodotti dal client stesso (stato 0): timeout, network_error, invalid_response (un successo il cui corpo non è JSON), no_session, refresh_discarded, invalid_path, invalid_body. L'autenticazione aggiunge codici come invalid_credentials, weak_password, email_already_in_use, user_not_found, invalid_otp, session_expired, session_revoked e rate_limit_exceeded. A 429 trasporta sempre rate_limit_exceeded.
Prova data anziché error quando ti serve il valore. Alcune chiamate hanno esito positivo senza contenuto (204), quindi sia data che error sono null.
4. Nuovi tentativi e timeout
Tentativi. Il client ritenta automaticamente una richiesta solo quando tutti questi valori sono validi:
- il metodo è
GEToHEAD(aPOST,PUT,PATCHoDELETEnon viene mai riprodotto, quindi nulla viene eseguito due volte); - lo stato della risposta è
408,429,502,503o504oppure la rete non è riuscita; - si sono verificati meno di 3 tentativi.
Il ritardo è casuale tra 0 e min(500 ms × 2^attempt, 10 s). Un colpo di testa Retry-After vince su di esso, limitato a 60 secondi. Le richieste riprovate portano un'intestazione X-Retry-Count. Un timeout non viene ripetuto.
Misurato rispetto a un server che ha risposto 503 due volte, quindi 200:
Timeout. Una richiesta che non ottiene risposta entro requestTimeoutMs (30 s per impostazione predefinita) termina con status: 0 e code: 'timeout'. La lettura del corpo è limitata dallo stesso limite, quindi un server che invia intestazioni e poi si blocca non può interrompere la chiamata. Una richiesta ad un server che non ha mai risposto, con un limite di 400 ms, restituiva l'errore dopo 405 ms.
Due casi non utilizzano questo limite perché gestiscono da soli: una chiamata in cui si passa un AbortSignal e i caricamenti. Le funzioni utilizzano la propria opzione timeout, vedere Errori, timeout e tentativi.
5. Osserva il cliente
onEvent riceve un evento per ogni cosa notevole fatta dal client. Non fa mai fallire una richiesta: un'eccezione lanciata dal tuo hook viene ignorata.
kind | Campi | Quando |
|---|---|---|
retry | attempt, status?, url | Prima di riprovare |
timeout | url | Una richiesta ha raggiunto requestTimeoutMs |
refresh-success | nessuno | Un aggiornamento della sessione è riuscito |
refresh-discarded | reason | Un aggiornamento è stato interrotto perché nel frattempo la sessione è cambiata |
jwks-fetch-failed | baseUrl | Impossibile recuperare le chiavi di firma (controlli dei token locali) |
storage-blocked | op | Il browser ha rifiutato l'accesso allo spazio di archiviazione |
Agli URL negli eventi viene rimossa la stringa di query e il frammento, poiché possono contenere segreti (?apikey=, collegamenti firmati).
6. Sessioni e token
- Il client invia
apikeysu ogni richiesta eAuthorization: Bearer <access token>una volta che l'utente ha effettuato l'accesso. - Aggiorna il token di accesso quando rimangono meno di 30 secondi. Gli aggiornamenti simultanei vengono uniti in uno solo, quindi un token di aggiornamento a rotazione viene utilizzato una volta.
- Un
401attiva un aggiornamento e una riproduzione della richiesta, quindi si interrompe. - In un browser, gli aggiornamenti sono coordinati tra le schede.
aura.auth.onAuthStateChange(callback)ti parla diSIGNED_IN,SIGNED_OUT,TOKEN_REFRESHED,USER_UPDATEDeMFA_CHALLENGE. Vedi la guida all'autenticazione.