هذه ترجمة للصفحة الأصلية بالإنجليزية. عند وجود أي اختلاف، تُعتمد النسخة الإنجليزية.
الأخطاء وproblem+json
الأخطاء في DaloyJS مواطن من الدرجة الأولى. كل HttpError يُرمى يُسلسل إلى problem+json وفق RFC 9457 مع URI ثابت في type، ومعرّف طلب، وترويسة Content-Type المناسبة.
- 01المعالجthrow new NotFoundError(...)أي صنف فرعي من HttpError
- 02الإطارالتحويل إلى حقول RFC 9457type · title · status · detail
- 03الإنتاجتنقيح detail في 5xxيظهر فقط عندما تكون البيئة development أو test
- 04الشبكةالاستجابة المُسلسلةapplication/problem+json + x-request-id
أصناف الأخطاء المدمجة
يتحقق TooManyRequestsError وServiceUnavailableError من retryAfterSeconds بالطريقة نفسها: أي قيمة ليست عددًا صحيحًا آمنًا غير سالب ترمي RangeError عند الإنشاء، فلا تتحول قيمة NaN الناتجة عن متغير بيئة مفقود أبدًا إلى ترويسة Retry-After غير صالحة. ومنذ 1.16.0 يكون RequestTimeoutError (مهلة requestTimeoutMs، راجع requestTimeoutStatus (بالإنجليزية)) بالقيمة no-store في كل صيغ الحالة، حتى لا تستمر ذاكرة تخزين مؤقت مشتركة في تقديم 503/504 بعد تعافي الخادم الخلفي. ويحصل new HttpError(status, …) المجرد على type للمشكلة بالصيغة https://httpstatuses.io/<status>؛ أما الأصناف المدمجة فتحمل عناوين URI ثابتة بالصيغة https://daloyjs.dev/errors/<slug>.
الرمي داخل معالج
صيغة الإرسال
يُعاد معرّف الطلب إلى العميل في موضعين: ترويسة الاستجابة x-request-id، والحقل instance في مستند المشكلة (وفق RFC 9457 §3.1) على هيئة URN بالصيغة urn:request:<uuid>. لا توجد خاصية requestId في المستوى الأعلى، لذا ينبغي للعملاء قراءة الترويسة أو تحليل الـ URN من instance.
التنقيح في الإنتاج
يحذف DaloyJS الحقل detail من أي استجابة 5xx ما لم تكن البيئة development أو test بشكل مؤكد، حتى لا تتسرب رسائل الأخطاء الداخلية ومقاطع SQL إلى العملاء. ويظل الخطأ الكامل يُرسل إلى أداة التسجيل لديك وإلى خطاف onError.
| الإعداد | detail في 5xx |
|---|---|
env: "development" أو env: "test" | ظاهر |
دون env، وNODE_ENV=development أو test | ظاهر |
دون env، وNODE_ENV غير مضبوط أو فارغ أو أي قيمة أخرى | منقّح |
env: "production" أو production: true أو NODE_ENV=production | منقّح |
production: false مع NODE_ENV غير مضبوط | منقّح |
البيئة غير المضبوطة تفشل بشكل مغلق عن قصد. فبيئات الحافة مثل Cloudflare Workers وDeno Deploy لا تملك NODE_ENV، ومعاملة ذلك كبيئة تطوير سترسل رسائل الاستثناءات إلى العملاء. يضبط daloy dev القيمة NODE_ENV=development لعمليته الفرعية إن لم تضبطها أنت، لذا يظل التطوير المحلي يعرض التفاصيل. أما الأخطاء التي تسلسلها بنفسك (مثل جسم استجابة مبني من err.message داخل كتلة catch) فلا تُنقَّح. ارمِها بدلًا من ذلك، أو ارمِ HttpError مع detail آمن.
أصناف أخطاء مخصصة
تضبط كل الأصناف المدمجة أعلاه type بالصيغة https://daloyjs.dev/errors/<slug>. أما HttpError العادي المرمي دون type فيعود إلى https://httpstatuses.io/<status>. والبرمجيات الوسيطة الرسمية التي تجيب بـ 503 (loadShedding() وconcurrencyLimit() وrequestTimeoutStatus: 503) تضبط type خاصًا بها على daloyjs.dev، لذا لا تنطبق القيمة البديلة إلا على الأخطاء التي تنشئها بنفسك. اضبط type عندما يعتمد عليه العملاء، أو استخدم صنفًا مدمجًا:
الخدمة غير متاحة
لوضع الصيانة، أو تعطل اعتمادية، أو نسخة قيد التصريف، ارمِ ServiceUnavailableError. فهو يجيب بـ 503 مع type ثابت هو https://daloyjs.dev/errors/service-unavailable، وRetry-After اختياري، وcache-control: no-store، حتى لا تستمر شبكة CDN في تقديم صفحة التعطل بعد تعافيك.
يجب أن يكون retryAfterSeconds عددًا صحيحًا غير سالب. أي قيمة أخرى (NaN من متغير بيئة مفقود، أو -1، أو 1.5) ترمي RangeError بدلًا من إرسال ترويسة Retry-After مشوّهة.
onError مخصص
آخر تحديث: