Logo Aurabase
aurabazadokumenty
dokumenty›Przewodniki›Client options and errors

Opcje klienta, błędy, ponowne próby i przekroczenia limitu czasu

Zachowanie wspólne dla każdej usługi pakietu SDK i opcje, które je zmieniają.

9 min przeczytane·Poziom mediator·Zmieniono 12 paź 2026
Ten tekst w języku angielskim został wygenerowany automatycznie na podstawie francuskiego oryginału i nie był jeszcze recenzowany.
Ta strona została przetłumaczona automatycznie. Wersja angielska jest miarodajna.
#
Tworzyć

1. Utwórz klienta

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

export const aura = createClient(
  process.env.AURA_URL!,       // https://my-app.aurabase.cloud
  process.env.AURA_ANON_KEY!,  // klucz publiczny
)

createClient(url, key, options?) pobiera adres URL projektu i jeden klucz. Projekt jest identyfikowany przez hosta adresu URL, więc nie ma identyfikatora projektu do przekazania. W stosie lokalnym użyj adresu URL z subdomeną projektu, na przykład http://my-app-ab12.localhost:8080; z pustym http://localhost:8080 klient drukuje ostrzeżenie, ponieważ brama nie jest w stanie określić, który projekt masz na myśli.

Użyj klucza publicznego (aura_anon_…) w przeglądarkach i aplikacjach. Klucz service_role (aura_sk_…) należy tylko do Twojego serwera i klient go wymusza:

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

// Tylko serwer: omija zabezpieczenia na poziomie wiersza.
export const admin = createAdminClient(process.env.AURA_URL!, process.env.AURA_SERVICE_ROLE_KEY!)

W przeglądarce createClient zgłasza po odebraniu klucza service_role, więc klucz, który wyciekł, nie może zostać przypadkowo wysłany. Ustaw refuseServiceRoleInBrowser: false, aby zmienić błąd na ostrzeżenie; nie rób tego na produkcji.

Każda usługa zawiesza się na kliencie: aura.auth, aura.db, aura.storage, aura.realtime, aura.functions, aura.ai, aura.notifications i aura.from('table') jako skrót do aura.db.from('table'). Zobacz referencje klienta.

#
Opcje

2. Opcje

OpcjaDomyślnyEfekt
auth.persistSessiontrue w przeglądarceUtrzymuj sesję pomiędzy ładowaniami stron
auth.storagelocalStorage w przeglądarce, pamięć gdzie indziejGdzie mieszka sesja: przekaż własny sklep (cookies dla SSR)
auth.autoRefreshtrueOdśwież token dostępu, zanim wygaśnie, i synchronizuj karty
auth.detectSessionInUrltrue w przeglądarcePrzeczytaj sesję z adresu URL po przekierowaniu OAuth, a następnie wyczyść adres URL
fetchglobalThis.fetchTwój własny fetch do testów lub serwerów proxy
retrytruePonów próbę odczytu błędów przejściowych. false wyłącza lub { enabled, maxRetries }
requestTimeoutMs30000Termin żądania. 0 wyłącza to.
onEventnicOdbiera zdarzenia obserwowalności, patrz poniżej
debugfalseWydrukuj także każde zdarzenie za pomocą console.debug('[aurabase]', event)
refuseServiceRoleInBrowsertrueZgłaszaj, gdy klucz service_role dotrze do przeglądarki

Do renderowania po stronie serwera użyj klientów opartych na plikach cookie opisanych w Next.js App Router i SSR.

#
Błędy

3. Obiekt błędu

Każde wywołanie zwraca { data, error } i nigdy nie powoduje zgłoszenia. W przypadku niepowodzenia error jest 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 lub 0, gdy awaria występuje po stronie klienta
  console.log(error.code)    // „WEWNĘTRZNY”, „limit czasu”, „błąd_sieci”, …
  console.log(error.message) // czytelne dla człowieka
  console.log(error.details) // surowa treść, w tym error.request_id z serwera
  isAuraError(error)         // PRAWDA
}

Zwrócono prawdziwe nieudane połączenie:

error.detailsjson
{ "error": { "code": "INTERNAL", "message": "boom", "request_id": "req-123" } }
PoleOznaczający
statusStan HTTP. 0 oznacza, że ​​awaria wystąpiła przed jakąkolwiek odpowiedzią: siecią, przekroczeniem limitu czasu lub odmową ze strony klienta.
codeStabilny identyfikator. Kody serwerów zachowują swoją wartość; klient dodaje poniższe kody.
messageCzytelne wyjaśnienie
detailsSurowa treść odpowiedzi
retryAfterSekundy oczekiwania z nagłówka Retry-After na 429
isNotFound, isUnauthorized, isForbidden, isRateLimitedSkróty na status

Kody wygenerowane przez samego klienta (status 0): timeout, network_error, invalid_response (sukces, którego treścią nie jest JSON), no_session, refresh_discarded, invalid_path, invalid_body. Uwierzytelnianie dodaje kody takie jak invalid_credentials, weak_password, email_already_in_use, user_not_found, invalid_otp, session_expired, session_revoked i rate_limit_exceeded. 429 zawsze zawiera rate_limit_exceeded.

Jeśli potrzebujesz wartości, przetestuj data zamiast error. Niektóre wywołania powiodą się bez treści (204), a następnie zarówno data, jak i error są null.

#
Odporność

4. Ponowne próby i przekroczenia limitu czasu

Ponowne próby. Klient automatycznie ponawia żądanie tylko wtedy, gdy wszystkie z nich spełniają:

  • metoda to GET lub HEAD (a POST, PUT, PATCH lub DELETE nigdy nie jest odtwarzane, więc nic nie działa dwukrotnie);
  • status odpowiedzi to 408, 429, 502, 503 lub 504 lub awaria sieci;
  • miały miejsce mniej niż 3 ponowne próby.

Opóźnienie jest losowe i mieści się w przedziale od 0 do min(500 ms × 2^attempt, 10 s). Zwycięża nagłówek Retry-After, ograniczony do 60 sekund. Ponowione żądania zawierają nagłówek X-Retry-Count. Limit czasu nie jest ponawiany.

Zmierzono w porównaniu z serwerem, który dwukrotnie odpowiedział 503, a następnie 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

Limity czasu. Żądanie, na które nie otrzymano odpowiedzi w ciągu requestTimeoutMs (domyślnie 30 s), kończy się status: 0 i code: 'timeout'. Odczyt treści jest ograniczony tym samym limitem, więc serwer, który wysyła nagłówki, a następnie zatrzymuje się, nie może zawiesić połączenia. Żądanie skierowane do serwera, który nigdy nie odpowiedział, z limitem 400 ms, zwróciło błąd po 405 ms.

Dwa przypadki nie korzystają z tego limitu, ponieważ zarządzają własnymi: wywołaniem, w którym przekazujesz AbortSignal i przesyłaniem. Funkcje używają własnej opcji timeout, zobacz Błędy, przekroczenia limitu czasu i ponowne próby.

#
Obserwowalność

5. Obserwuj klienta

onEvent otrzymuje jedno zdarzenie na każdą godną uwagi rzecz, którą robi klient. Nigdy nie powoduje to niepowodzenia żądania: wyjątek zgłoszony przez hak jest ignorowany.

kindPolaGdy
retryattempt, status?, urlPrzed ponowną próbą
timeouturlŻądanie trafiło requestTimeoutMs
refresh-successnicOdświeżenie sesji powiodło się
refresh-discardedreasonOdświeżanie zostało przerwane, ponieważ w międzyczasie sesja uległa zmianie
jwks-fetch-failedbaseUrlNie można pobrać kluczy podpisujących (lokalne sprawdzanie tokenów)
storage-blockedopPrzeglądarka odmówiła dostępu do pamięci
observe.tstypescript
const aura = createClient(url, key, {
  onEvent: (e) => metrics.increment(`aurabase.${e.kind}`),
})

Adresy URL w zdarzeniach mają usunięty ciąg zapytania i fragment, ponieważ mogą zawierać sekrety (?apikey=, podpisane linki).

#
Sesje

6. Sesje i tokeny

  • Klient wysyła apikey przy każdym żądaniu i Authorization: Bearer <access token> po zalogowaniu się użytkownika.
  • Odświeża token dostępu, gdy pozostało mniej niż 30 sekund. Równoczesne odświeżenia są łączone w jedno, więc rotacyjny token odświeżania jest używany tylko raz.
  • 401 wyzwala jedno odświeżenie i jedno powtórzenie żądania, a następnie zatrzymuje się.
  • W przeglądarce odświeżania są koordynowane na różnych kartach.
  • aura.auth.onAuthStateChange(callback) informuje o SIGNED_IN, SIGNED_OUT, TOKEN_REFRESHED, USER_UPDATED i MFA_CHALLENGE. Zobacz przewodnik autoryzacji.
Ostatnia aktualizacja · 12 paź 2026