Aurabase-logo
aurabasisdocumenten
documenten›Gidsen›Client options and errors

Clientopties, fouten, nieuwe pogingen en time-outs

Het gedrag dat door elke service van de SDK wordt gedeeld, en de opties die dit veranderen.

9 min lezen·Niveau tussenproduct·Herzien op 12 okt 2026
Deze Engelse tekst is automatisch gegenereerd op basis van het Franse origineel en is nog niet beoordeeld.
Deze pagina is automatisch vertaald. De Engelse versie is gezaghebbend.
#
Creëer

1. Maak de klant aan

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

export const aura = createClient(
  process.env.AURA_URL!,       // https://mijn-app.aurabase.cloud
  process.env.AURA_ANON_KEY!,  // de publieke sleutel
)

createClient(url, key, options?) neemt de project-URL en één sleutel. Het project wordt geïdentificeerd door de host van de URL, er hoeft dus geen project-ID door te geven. Gebruik in een lokale stapel een URL met het projectsubdomein, zoals http://my-app-ab12.localhost:8080; met een kale http://localhost:8080 drukt de client een waarschuwing af, omdat de gateway niet kan zien welk project u bedoelt.

Gebruik de openbare sleutel (aura_anon_…) in browsers en apps. Een service_role sleutel (aura_sk_…) hoort alleen op uw server en de client dwingt deze af:

server/admin.tstypescript
import { createAdminClient } from '@aurabase/aurabase-js'

// Alleen server: omzeilt beveiliging op rijniveau.
export const admin = createAdminClient(process.env.AURA_URL!, process.env.AURA_SERVICE_ROLE_KEY!)

In een browser genereert createClient wanneer er een service_role-sleutel wordt ontvangen, zodat een gelekte sleutel niet per ongeluk kan worden verzonden. Stel refuseServiceRoleInBrowser: false in om de fout te downgraden naar een waarschuwing; doe dit niet in de productie.

Elke service hangt buiten de client: aura.auth, aura.db, aura.storage, aura.realtime, aura.functions, aura.ai, aura.notifications en aura.from('table') als snelkoppeling voor aura.db.from('table'). Zie de clientreferentie.

#
Opties

2. Opties

OptieStandaardEffect
auth.persistSessiontrue in een browserHoud de sessie tussen het laden van pagina's
auth.storagelocalStorage in een browser, geheugen eldersWaar de sessie leeft: passeer uw eigen winkel (cookies voor SSR)
auth.autoRefreshtrueVernieuw het toegangstoken voordat het verloopt en houd tabbladen gesynchroniseerd
auth.detectSessionInUrltrue in een browserLees een sessie vanaf de URL na een OAuth-omleiding en maak vervolgens de URL schoon
fetchglobalThis.fetchUw eigen fetch, voor tests of proxy's
retrytrueProbeer opnieuw te lezen bij tijdelijke fouten. false wordt uitgeschakeld, of { enabled, maxRetries }
requestTimeoutMs30000Termijn van een verzoek. 0 schakelt het uit.
onEventgeenOntvangt waarneembaarheidsgebeurtenissen, zie hieronder
debugfalseDruk elke gebeurtenis ook af met console.debug('[aurabase]', event)
refuseServiceRoleInBrowsertrueGooi wanneer een service_role-sleutel een browser bereikt

Voor weergave op de server gebruikt u de op cookies gebaseerde clients die worden beschreven in Next.js App Router en SSR.

#
Fouten

3. Het foutobject

Elke oproep retourneert { data, error } en gooit nooit. Als het mislukt, is error een AuraError:

errors.tstypescript
import { isAuraError } from '@aurabase/aurabase-js'

const { data, error } = await aura.db.from('posts').select('*')
if (error) {
  console.log(error.status)  // 500 of 0 als de fout op de client ligt
  console.log(error.code)    // 'INTERNAL', 'time-out', 'netwerkfout', …
  console.log(error.message) // voor mensen leesbaar
  console.log(error.details) // de onbewerkte body, inclusief error.request_id van de server
  isAuraError(error)         // waar
}

Er kwam een echte mislukte oproep terug:

error.detailsjson
{ "error": { "code": "INTERNAL", "message": "boom", "request_id": "req-123" } }
VeldBetekenis
statusDe HTTP-status. 0 betekent dat de fout plaatsvond vóór enige reactie: netwerk, time-out of een weigering door de client.
codeEen stabiele identificatie. Servercodes behouden hun waarde; de klant voegt de onderstaande codes toe.
messageEen leesbare uitleg
detailsHet ruwe antwoordlichaam
retryAfterSeconden om te wachten, vanaf een Retry-After header, op een 429
isNotFound, isUnauthorized, isForbidden, isRateLimitedSnelkoppelingen op status

Codes geproduceerd door de klant zelf (status 0): timeout, network_error, invalid_response (een succes waarvan de hoofdtekst geen JSON is), no_session, refresh_discarded, invalid_path, invalid_body. Authenticatie voegt codes toe zoals invalid_credentials, weak_password, email_already_in_use, user_not_found, invalid_otp, session_expired, session_revoked en rate_limit_exceeded. Een 429 bevat altijd rate_limit_exceeded.

Test data in plaats van error wanneer u de waarde nodig heeft. Sommige oproepen slagen zonder inhoud (204), en dan zijn zowel data als error null.

#
Veerkracht

4. Nieuwe pogingen en time-outs

Nieuwe pogingen. De client probeert een verzoek alleen automatisch opnieuw als deze allemaal geldig zijn:

  • de methode is GET of HEAD (een POST, PUT, PATCH of DELETE wordt nooit opnieuw afgespeeld, dus niets wordt tweemaal uitgevoerd);
  • de reactiestatus is 408, 429, 502, 503 of 504, of het netwerk is mislukt;
  • Er zijn minder dan 3 nieuwe pogingen gedaan.

De vertraging is willekeurig tussen 0 en min(500 ms × 2^attempt, 10 s). Een kopbal van Retry-After wint ervan, met een maximum van 60 seconden. Opnieuw geprobeerde verzoeken hebben een header X-Retry-Count. Een time-out wordt niet opnieuw geprobeerd.

Gemeten tegen een server die tweemaal 503 antwoordde, daarna 200:

text
GET  /flaky   590 ms  { data: [...] }          events: retry#1:503, retry#2:503
POST /flaky     5 ms  { error: SERVICE_UNAVAILABLE }   (not retried)
GET  /flaky     1 ms  { error: SERVICE_UNAVAILABLE }   with retry: false

Time-outs. Een verzoek dat geen antwoord krijgt binnen requestTimeoutMs (standaard 30 s) eindigt met status: 0 en code: 'timeout'. Het lezen van de hoofdtekst wordt begrensd door dezelfde limiet, dus een server die headers verzendt en vervolgens vastloopt, kan het gesprek niet ophangen. Een verzoek aan een server die nooit antwoordde, met een limiet van 400 ms, retourneerde de fout na 405 ms.

In twee gevallen wordt deze limiet niet gebruikt omdat ze hun eigen limiet beheren: een oproep waarbij u een AbortSignal doorgeeft en uploadt. Functies gebruiken hun eigen timeout optie, zie Fouten, time-outs en nieuwe pogingen.

#
Waarneembaarheid

5. Observeer de cliënt

onEvent ontvangt één gebeurtenis per opmerkelijk ding dat de client doet. Het zorgt er nooit voor dat een verzoek mislukt: een uitzondering die door je hook wordt gegenereerd, wordt genegeerd.

kindVeldenWanneer
retryattempt, status?, urlVóór een nieuwe poging
timeouturlEen verzoek heeft requestTimeoutMs bereikt
refresh-successgeenEen sessievernieuwing is gelukt
refresh-discardedreasonEen vernieuwing is afgebroken omdat de sessie ondertussen is gewijzigd
jwks-fetch-failedbaseUrlDe ondertekeningssleutels konden niet worden opgehaald (lokale tokencontroles)
storage-blockedopDe browser weigerde opslagtoegang
observe.tstypescript
const aura = createClient(url, key, {
  onEvent: (e) => metrics.increment(`aurabase.${e.kind}`),
})

Van URL's in gebeurtenissen zijn de queryreeks en het fragment verwijderd, omdat ze geheimen kunnen bevatten (?apikey=, ondertekende links).

#
Sessies

6. Sessies en tokens

  • De client verzendt apikey bij elk verzoek en Authorization: Bearer <access token> zodra een gebruiker is aangemeld.
  • Het vernieuwt het toegangstoken als er minder dan 30 seconden resteren. Gelijktijdige vernieuwingen worden samengevoegd tot één vernieuwingstoken, zodat er één keer een roterend vernieuwingstoken wordt gebruikt.
  • Een 401 activeert één keer vernieuwen en één keer opnieuw afspelen van het verzoek en stopt vervolgens.
  • In een browser worden vernieuwingen over de tabbladen heen gecoördineerd.
  • aura.auth.onAuthStateChange(callback) vertelt je over SIGNED_IN, SIGNED_OUT, TOKEN_REFRESHED, USER_UPDATED en MFA_CHALLENGE. Zie de auth-gids.
Laatst bijgewerkt · 12 okt 2026