Параметры клиента, ошибки, повторы и тайм-ауты
Поведение, общее для каждой службы SDK, и параметры, которые его меняют.
1. Создайте клиента
createClient(url, key, options?) принимает URL-адрес проекта и один ключ. Проект идентифицируется хостом URL-адреса, поэтому идентификатор проекта не требуется передавать. В локальном стеке используйте URL-адрес с поддоменом проекта, например http://my-app-ab12.localhost:8080; с голым http://localhost:8080 клиент печатает предупреждение, потому что шлюз не может определить, какой проект вы имеете в виду.
Используйте открытый ключ (aura_anon_…) в браузерах и приложениях. Ключ service_role (aura_sk_…) принадлежит только вашему серверу, и клиент применяет его:
В браузере createClient выдает при получении ключа service_role, поэтому утечка ключа не может быть доставлена случайно. Установите refuseServiceRoleInBrowser: false, чтобы перевести ошибку в предупреждение; не делайте этого на производстве.
Каждая служба зависает на клиенте: aura.auth, aura.db, aura.storage, aura.realtime, aura.functions, aura.ai, aura.notifications и aura.from('table') как ярлык для aura.db.from('table'). См. ссылку на клиента.
2. Опции
| Вариант | По умолчанию | Эффект |
|---|---|---|
auth.persistSession | true в браузере | Сохраняйте сеанс между загрузками страниц |
auth.storage | localStorage в браузере, память в другом месте | Где живет сессия: передайте свой собственный магазин (куки для SSR) |
auth.autoRefresh | true | Обновляйте токен доступа до истечения срока его действия и синхронизируйте вкладки. |
auth.detectSessionInUrl | true в браузере | Прочитайте сеанс по URL-адресу после перенаправления OAuth, затем очистите URL-адрес. |
fetch | globalThis.fetch | Ваш собственный fetch для тестов или прокси. |
retry | true | Повторить чтение при временных ошибках. false отключает или { enabled, maxRetries } |
requestTimeoutMs | 30000 | Срок рассмотрения запроса. 0 отключает его. |
onEvent | никто | Получает события наблюдения, см. ниже. |
debug | false | Также распечатайте каждое событие с помощью console.debug('[aurabase]', event). |
refuseServiceRoleInBrowser | true | Выдавать, когда ключ service_role достигает браузера |
Для рендеринга на стороне сервера используйте клиенты на основе файлов cookie, описанные в Next.js App Router и SSR.
3. Объект ошибки
Каждый вызов возвращает { data, error } и никогда не выдает ошибку. В случае сбоя error становится AuraError:
Настоящий неудачный вызов вернулся:
| Поле | Значение |
|---|---|
status | HTTP-статус. 0 означает, что сбой произошел до какого-либо ответа: сети, тайм-аута или отказа клиента. |
code | Стабильный идентификатор. Коды серверов сохраняют свою ценность; клиент добавляет коды ниже. |
message | Читабельное объяснение |
details | Необработанное тело ответа |
retryAfter | Секунды ожидания из заголовка Retry-After на 429 |
isNotFound, isUnauthorized, isForbidden, isRateLimited | Ярлыки на status |
Коды, созданные самим клиентом (статус 0): timeout, network_error, invalid_response (успех, тело которого не является JSON), no_session, refresh_discarded, invalid_path, invalid_body. Аутентификация добавляет такие коды, как invalid_credentials, weak_password, email_already_in_use, user_not_found, invalid_otp, session_expired, session_revoked и rate_limit_exceeded. 429 всегда содержит rate_limit_exceeded.
Проверяйте data вместо error, когда вам нужно значение. Некоторые вызовы завершаются успешно без содержимого (204), и тогда и data, и error становятся null.
4. Повторные попытки и таймауты
Повторные попытки. Клиент автоматически повторяет запрос только в том случае, если выполняются все следующие условия:
- метод —
GETилиHEAD(POST,PUT,PATCHилиDELETEникогда не воспроизводится повторно, поэтому ничего не выполняется дважды); - статус ответа —
408,429,502,503или504, или произошел сбой в сети; - произошло менее 3 повторных попыток.
Задержка является случайной в диапазоне от 0 до min(500 ms × 2^attempt, 10 s). Заголовок Retry-After побеждает его, его продолжительность ограничена 60 секундами. Повторные запросы содержат заголовок X-Retry-Count. Тайм-аут не повторяется.
Измерено на сервере, который дважды ответил на 503, а затем на 200:
Тайм-ауты. Запрос, на который не получен ответ в течение requestTimeoutMs (по умолчанию 30 с), заканчивается status: 0 и code: 'timeout'. Чтение тела ограничено тем же пределом, поэтому сервер, который отправляет заголовки, а затем останавливается, не может прервать вызов. Запрос к серверу, который так и не ответил, с ограничением в 400 мс, вернул ошибку через 405 мс.
В двух случаях это ограничение не используется, поскольку они управляются самостоятельно: вызов, в котором вы передаете AbortSignal, и загрузка. Функции используют собственную опцию timeout, см. Ошибки, таймауты и повторы.
5. Наблюдайте за клиентом
onEvent получает одно событие на каждое заметное действие клиента. Он никогда не приводит к сбою запроса: исключение, вызванное вашим перехватчиком, игнорируется.
kind | Поля | Когда |
|---|---|---|
retry | attempt, status?, url | Перед повторной попыткой |
timeout | url | Запрос хит requestTimeoutMs |
refresh-success | никто | Обновление сеанса выполнено успешно |
refresh-discarded | reason | Обновление было прекращено, поскольку сеанс тем временем изменился. |
jwks-fetch-failed | baseUrl | Не удалось получить ключи подписи (локальная проверка токена). |
storage-blocked | op | Браузер отказал в доступе к хранилищу |
Из URL-адресов в событиях удаляются строка запроса и фрагмент, поскольку они могут содержать секреты (?apikey=, подписанные ссылки).
6. Сессии и токены
- Клиент отправляет
apikeyпри каждом запросе иAuthorization: Bearer <access token>после входа пользователя в систему. - Он обновляет токен доступа, когда остается менее 30 секунд. Параллельные обновления объединяются в одно, поэтому токен ротационного обновления используется один раз.
401запускает одно обновление и одно повторение запроса, а затем останавливается.- В браузере обновления координируются по вкладкам.
aura.auth.onAuthStateChange(callback)расскажет вам оSIGNED_IN,SIGNED_OUT,TOKEN_REFRESHED,USER_UPDATEDиMFA_CHALLENGE. См. руководство по аутентификации.