客户端选项、错误、重试和超时
SDK 的每个服务共享的行为以及更改它的选项。
1. 创建客户端
createClient(url, key, options?) 采用 项目 URL 和一键。该项目由 URL 的主机标识,因此无需传递项目 id。在本地堆栈中,使用带有项目子域的 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 的 cookie) |
auth.autoRefresh | true | 在访问令牌过期之前刷新它,并保持选项卡同步 |
auth.detectSessionInUrl | 浏览器中的 true | 在 OAuth 重定向后从 URL 读取会话,然后清理 URL |
fetch | globalThis.fetch | 您自己的 fetch,用于测试或代理 |
retry | true | 重试读取暂时性错误。 false 禁用,或 { enabled, maxRetries } |
requestTimeoutMs | 30000 | 请求的时间限制。 0 禁用它。 |
onEvent | 无 | 接收可观察性事件,见下文 |
debug | false | 还可以使用 console.debug('[aurabase]', event) 打印每个事件 |
refuseServiceRoleInBrowser | true | 当 service_role 键到达浏览器时抛出 |
对于服务器端渲染,请使用 Next.js App Router 和 SSR中描述的基于 cookie 的客户端。
3. 错误对象
每次调用都会返回 { data, error } 并且不会抛出异常。当失败时, error 是 AuraError:
返回了一个真正失败的调用:
| 领域 | 含义 |
|---|---|
status | HTTP 状态。 0 表示在任何响应之前发生故障:网络、超时或客户端拒绝。 |
code | 稳定的标识符。服务器代码保持其价值;客户端添加以下代码。 |
message | 可读的解释 |
details | 原始响应体 |
retryAfter | 在 429 上从 Retry-After 标头等待的秒数 |
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的信息。请参阅 身份验证指南。