خيارات العميل والأخطاء وإعادة المحاولة والمهلة
السلوك الذي تشاركه كل خدمة من خدمات 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 إلى المتصفح |
بالنسبة للعرض من جانب الخادم، استخدم العملاء المستندين إلى ملفات تعريف الارتباط الموضحين في 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. راجع دليل المصادقة.