شعار أوراباسي
aurabaseمستندات
مستندات›Edge Functions›Errors, timeouts and retries

الأخطاء والمهلات وإعادة المحاولة

كيفية قراءة ما يعود به invoke عندما يحدث خطأ ما، ومتى يمكنك الاتصال بأمان مرة أخرى.

9 د قراءة·المستوى وسيطة·تمت المراجعة في 12‏/10‏/2026
تم إنشاء هذا النص الإنجليزي تلقائيًا من النص الأصلي الفرنسي ولم تتم مراجعته بعد.
تمت ترجمة هذه الصفحة تلقائيًا. النسخة الإنجليزية موثوقة.
#
التشريح

1. كائن الخطأ

invoke يُرجع { data, error } ولا يُرمي أبدًا. error هو AuraError، لذا فإن isAuraError(error) صحيح. تخبرك فئتان فرعيتان بمن فشل:

classify.tstypescript
import { FunctionsHttpError, FunctionsRelayError } from '@aurabase/aurabase-js'

const { data, error } = await aura.functions.invoke('checkout', { body })

if (error instanceof FunctionsHttpError) {
  // تم الرد على وظيفتك بحالة خطأ. تصحيح التعليمات البرمجية الخاصة بك.
} else if (error instanceof FunctionsRelayError) {
  // فشل النظام الأساسي: لم تعد إجابة وظيفتك أبدًا.
} else if (error) {
  // تم إلغاء المكالمة أو رفضها على العميل (مهلة، valid_body، no_session).
}
الميدانمعنى
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. ما هو الخطأ؟

السلوكيات التي تمت ملاحظتها ضد المكدس قيد التشغيل. يتبع صف الحصص تعيين الأخطاء في الواجهة الخلفية ولم يتم تشغيله في اختباراتنا.

ماذا حدثفئةstatuscodemessage
الوظيفة غير موجودةFunctionsHttpError404NOT_FOUND"...الوظيفة 'كلا' غير قابلة للاختراق"
تقوم وظيفتك بإرجاع 500 مع النصFunctionsHttpError500http_500هذا النص
تقوم وظيفتك بإرجاع 503 نفسهاFunctionsHttpError503http_503ما عدت
رميات وظيفتكFunctionsHttpError500http_500"خطأ داخلي في الخادم"
تتجاوز وظيفتك timeout_secsFunctionsHttpError500 أو 503http_500 / http_503"فشل تنفيذ الوظيفة" أو "تم إرجاع الوظيفة HTTP 503"
وقت التشغيل غير قابل للوصولFunctionsRelayError503SERVICE_UNAVAILABLEيوضح أن الوظيفة كانت وليست قيد التشغيل
فشل الشبكة قبل أي استجابةFunctionsRelayError0network_errorخطأ الشبكة
استنفدت حصة الخطةFunctionsHttpError403QUOTA_EXCEEDEDرسالة الحصص
عدد كبير جدًا من المكالمات من عميل واحدFunctionsHttpError429rate_limit_exceededانتظر الرسالة
نص الطلب كبير جدًاFunctionsRelayError503SERVICE_UNAVAILABLE"تم تجاوز الحد الأقصى لحجم الحمولة"
لقد قمت بالإلغاء، أو انقضى timeout الخاص بكAuraError0timeout"تم إحباط استدعاء الوظيفة أو انتهاء مهلتها"
لا يمكن إرسال النص كـ JSONAuraError0invalid_bodyيسمي النوع الذي يجب تجنبه
503 من وظيفتك لا يمثل فشلاً في النظام الأساسي

إذا قام الكود الخاص بك بإرجاع 502 أو 503 أو 504، فستحصل على FunctionsHttpError: يخبرك الفصل بمن أجاب، وليس رقم الحالة.

يبدو الفشلان كشيء آخر

يتم رفض نص الطلب الذي يزيد حجمه عن 256 كيلو بايت تقريبًا باستخدام 503 SERVICE_UNAVAILABLE، ولم يتم إرجاع استجابة التي يبلغ حجمها حوالي 300 كيلو بايت أو أكثر خلال اختبارنا الذي يستغرق 50 ثانية. راجع حدود . إعادة المحاولة لا تساعد؛ أرسل بيانات أقل، أو استخدم التخزين.

#
أعد المحاولة

3. قرر ما إذا كنت تريد إعادة المحاولة

لا يقوم SDK أبدًا بإعادة محاولة استدعاء لك: قد يكون لوظيفتك آثار جانبية، وPOST المتكرر ليس آمنًا بشكل افتراضي. عليك أن تقرر، باستخدام الجدول أدناه.

الفشلهل تم تشغيل الدالة؟هل من الآمن إعادة المحاولة؟
503 من المنصة (FunctionsRelayError)لا، كان وقت التشغيل غير قابل للوصولنعم، مع تراجع قصير
429لانعم، بعد التأخير في error.retryAfter
403 QUOTA_EXCEEDEDلالا، حتى يتم إعادة ضبط الحصة أو تغيير الخطة
status 0 (network_error)غير معروففقط إذا كانت وظيفتك عاجزة
timeout على العميلغير معروففقط إذا كانت وظيفتك عاجزة
FunctionsHttpError 5xxنعم، جزئيا أو كليافقط إذا كانت وظيفتك عاجزة
FunctionsHttpError 4xxنعملا: أصلح الطلب
retry.tstypescript
import { FunctionsRelayError } from '@aurabase/aurabase-js'

async function invokeWithRetry(name: string, body: unknown, attempts = 3) {
  for (let i = 0; i < attempts; i++) {
    const res = await aura.functions.invoke(name, { body })
    const safe = res.error instanceof FunctionsRelayError && res.error.status === 503
    if (!res.error || !safe) return res
    await new Promise((r) => setTimeout(r, 2 ** i * 500))
  }
  return aura.functions.invoke(name, { body })
}
اجعل الوظيفة غير فعالة بدلاً من ذلك

لا يقوم النظام الأساسي بإلغاء تكرار المكالمات ويتجاهل Idempotency-Key. بالنسبة للمدفوعات أو البريد الإلكتروني، قم بتخزين المفتاح الذي قمت بتمريره في body والتحقق منه في بداية الوظيفة.

#
الوقت

4. المهلات

ثلاث ساعات تعمل في وقت واحد:

الساعةالافتراضيأين تغييره
العميل الخاص بك30 ثانية لكل responseTypeinvoke(…, { timeout }) أو { signal } أو requestTimeoutMs في خيارات العميل
الوظيفة30 ثانية، بين 1 و300permissions.timeout_secs على الوظيفة
البوابة380 sغير قابل للتكوين بواسطة المشاريع

عندما تتجاوز الدالة timeout_secs، فإن وقت التشغيل يلغيها وتفشل مكالمتك بعد هذا التأخير تقريبًا، مع 500 أو 503 الموضح أعلاه. يظهر السبب في error.context.detail (WorkerRequestCancelled: request has been cancelled by supervisor) في الوضع الأولي. قم بتعيين عميلك timeout أعلى قليلاً من timeout_secs الخاص بالوظيفة لرؤية هذا الخطأ بدلاً من العميل timeout.

timeout.tstypescript
const { error } = await aura.functions.invoke('report', { timeout: 35_000 })
if (error?.code === 'timeout') {
  // تم الإلغاء من قبل عميلك. ربما لا تزال الوظيفة قيد التشغيل.
}

للعمل لمدة أطول من بضع ثوانٍ، قم بوضع في قائمة الانتظار لمهمة بدلاً من إبقاء الاتصال مفتوحًا.

#
تصحيح

5. ابحث عن السبب

  • تحمل أخطاء النظام الأساسي معرف الطلب: error.details.error.request_id. اقتبسها عند الاتصال بالدعم.
  • يسرد aura functions logs <name> طلبات HTTP الأخيرة مع الطريقة والمسار والحالة والمدة ومعرف الطلب. إنه لا يعرض ما كتبته وظيفتك باستخدام console.log أو console.error: يبقى هذا الإخراج في سجلات وقت التشغيل الخاصة، والتي لا يمكن قراءتها إلا لمشغل النظام الأساسي. راجع حدود للتعرف على هذا والفجوات الحالية الأخرى.
  • لا يتم إعادة توجيه معرف المكالمة إلى وظيفتك. قم بتمرير المعرف الخاص بك إلى headers وقم بتسجيله.