الأخطاء والمهلات وإعادة المحاولة
كيفية قراءة ما يعود به invoke عندما يحدث خطأ ما، ومتى يمكنك الاتصال بأمان مرة أخرى.
1. كائن الخطأ
invoke يُرجع { data, error } ولا يُرمي أبدًا. error هو AuraError، لذا فإن isAuraError(error) صحيح. تخبرك فئتان فرعيتان بمن فشل:
| الميدان | معنى |
|---|---|
error.status | حالة HTTP. 0 يعني أن الفشل حدث على العميل (لا توجد استجابة). |
error.code | المعرف الثابت، على سبيل المثال NOT_FOUND, QUOTA_EXCEEDED, timeout, invalid_body. |
error.message | النص الذي أعادته وظيفتك، أو شرح النظام الأساسي. |
error.context | على FunctionsHttpError: النص الذي أعادته وظيفتك (JSON أو نص تم تحليله). |
error.details | هيئة الخطأ الخام. بالنسبة لخطأ في النظام الأساسي، فهو يحتوي على error.request_id. |
2. ما هو الخطأ؟
السلوكيات التي تمت ملاحظتها ضد المكدس قيد التشغيل. يتبع صف الحصص تعيين الأخطاء في الواجهة الخلفية ولم يتم تشغيله في اختباراتنا.
| ماذا حدث | فئة | status | code | message |
|---|---|---|---|---|
| الوظيفة غير موجودة | FunctionsHttpError | 404 | NOT_FOUND | "...الوظيفة 'كلا' غير قابلة للاختراق" |
تقوم وظيفتك بإرجاع 500 مع النص | FunctionsHttpError | 500 | http_500 | هذا النص |
تقوم وظيفتك بإرجاع 503 نفسها | FunctionsHttpError | 503 | http_503 | ما عدت |
| رميات وظيفتك | FunctionsHttpError | 500 | http_500 | "خطأ داخلي في الخادم" |
تتجاوز وظيفتك timeout_secs | FunctionsHttpError | 500 أو 503 | http_500 / http_503 | "فشل تنفيذ الوظيفة" أو "تم إرجاع الوظيفة HTTP 503" |
| وقت التشغيل غير قابل للوصول | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | يوضح أن الوظيفة كانت وليست قيد التشغيل |
| فشل الشبكة قبل أي استجابة | FunctionsRelayError | 0 | network_error | خطأ الشبكة |
| استنفدت حصة الخطة | FunctionsHttpError | 403 | QUOTA_EXCEEDED | رسالة الحصص |
| عدد كبير جدًا من المكالمات من عميل واحد | FunctionsHttpError | 429 | rate_limit_exceeded | انتظر الرسالة |
| نص الطلب كبير جدًا | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | "تم تجاوز الحد الأقصى لحجم الحمولة" |
لقد قمت بالإلغاء، أو انقضى timeout الخاص بك | AuraError | 0 | timeout | "تم إحباط استدعاء الوظيفة أو انتهاء مهلتها" |
| لا يمكن إرسال النص كـ JSON | AuraError | 0 | invalid_body | يسمي النوع الذي يجب تجنبه |
إذا قام الكود الخاص بك بإرجاع 502 أو 503 أو 504، فستحصل على FunctionsHttpError: يخبرك الفصل بمن أجاب، وليس رقم الحالة.
3. قرر ما إذا كنت تريد إعادة المحاولة
لا يقوم SDK أبدًا بإعادة محاولة استدعاء لك: قد يكون لوظيفتك آثار جانبية، وPOST المتكرر ليس آمنًا بشكل افتراضي. عليك أن تقرر، باستخدام الجدول أدناه.
| الفشل | هل تم تشغيل الدالة؟ | هل من الآمن إعادة المحاولة؟ |
|---|---|---|
503 من المنصة (FunctionsRelayError) | لا، كان وقت التشغيل غير قابل للوصول | نعم، مع تراجع قصير |
429 | لا | نعم، بعد التأخير في error.retryAfter |
403 QUOTA_EXCEEDED | لا | لا، حتى يتم إعادة ضبط الحصة أو تغيير الخطة |
status 0 (network_error) | غير معروف | فقط إذا كانت وظيفتك عاجزة |
timeout على العميل | غير معروف | فقط إذا كانت وظيفتك عاجزة |
FunctionsHttpError 5xx | نعم، جزئيا أو كليا | فقط إذا كانت وظيفتك عاجزة |
FunctionsHttpError 4xx | نعم | لا: أصلح الطلب |
لا يقوم النظام الأساسي بإلغاء تكرار المكالمات ويتجاهل Idempotency-Key. بالنسبة للمدفوعات أو البريد الإلكتروني، قم بتخزين المفتاح الذي قمت بتمريره في body والتحقق منه في بداية الوظيفة.
4. المهلات
ثلاث ساعات تعمل في وقت واحد:
| الساعة | الافتراضي | أين تغييره |
|---|---|---|
| العميل الخاص بك | 30 ثانية لكل responseType | invoke(…, { timeout }) أو { signal } أو requestTimeoutMs في خيارات العميل |
| الوظيفة | 30 ثانية، بين 1 و300 | permissions.timeout_secs على الوظيفة |
| البوابة | 380 s | غير قابل للتكوين بواسطة المشاريع |
عندما تتجاوز الدالة timeout_secs، فإن وقت التشغيل يلغيها وتفشل مكالمتك بعد هذا التأخير تقريبًا، مع 500 أو 503 الموضح أعلاه. يظهر السبب في error.context.detail (WorkerRequestCancelled: request has been cancelled by supervisor) في الوضع الأولي. قم بتعيين عميلك timeout أعلى قليلاً من timeout_secs الخاص بالوظيفة لرؤية هذا الخطأ بدلاً من العميل timeout.
للعمل لمدة أطول من بضع ثوانٍ، قم بوضع في قائمة الانتظار لمهمة بدلاً من إبقاء الاتصال مفتوحًا.
5. ابحث عن السبب
- تحمل أخطاء النظام الأساسي معرف الطلب:
error.details.error.request_id. اقتبسها عند الاتصال بالدعم. - يسرد
aura functions logs <name>طلبات HTTP الأخيرة مع الطريقة والمسار والحالة والمدة ومعرف الطلب. إنه لا يعرض ما كتبته وظيفتك باستخدامconsole.logأوconsole.error: يبقى هذا الإخراج في سجلات وقت التشغيل الخاصة، والتي لا يمكن قراءتها إلا لمشغل النظام الأساسي. راجع حدود للتعرف على هذا والفجوات الحالية الأخرى. - لا يتم إعادة توجيه معرف المكالمة إلى وظيفتك. قم بتمرير المعرف الخاص بك إلى
headersوقم بتسجيله.