أنشر هذا لأنه استغرق مني بضع ساعات وفشل بصمت، وهذا أسوأ مزيج. إذا كنت توجه أي شيء مهم عبر عقدة IF أو Switch على قيمة منطقية، فهذا يستحق عشر دقائق من وقتك.
هناك عدة مشاكل مفتوحة وخيوط منتدى تصف هذا السلوك بدون سبب جذري مرفق. هذا ما وجدته.
الأعراض
كان لدي عقدة Switch تقرر ما إذا كان سيتم إرسال تنبيه. كان مخرج العقدة العلوية يبدو هكذا:
{ “shouldEscalate”: true }
شرط Switch: القيمة:
{{ $(‘Extract Response’).first().json.shouldEscalate }}
المشغل: Boolean → is true
تم توجيه كل عملية تنفيذ إلى false. لا خطأ. تم الإبلاغ عن نجاح التنفيذ. التنبيه لم ينطلق أبداً.
ما لم يكن
أضعت وقتاً في الفرضيات الخاطئة أولاً، إذاً إليها لتوفير عليك الرحلة:
• ليس .first() مقابل .item — تحققت
• ليست مشكلة multi-run/item-lineage
• ليست العقدة العلوية التي تنتج القيمة الخاطئة
أثبتت الأخيرة بإسقاط عقدة Set مباشرة قبل Switch التي أطلقت القيمة الخام بالإضافة إلى نوعها: { “val”: true, “type”: “boolean”, “runs”: 1 }
قيمة منطقية حقيقية. تشغيل واحد. القيمة الصحيحة تصل إلى العقدة. وحتى الآن أرسل Switch القيمة false.
السبب الفعلي
يعرض n8n مخرج تعبير {{ }} كنص. إذاً تصل قيمة منطقية حقيقية true إلى المشغل كسلسلة نصية “true” — وإذا كان هناك أي مسافة بيضاء زائدة أو سطر جديد في حقل المعامل بعد الإغلاق }} (من السهل جداً إدخاله عند اللصق)، تحصل على "true ".
مشغل Boolean الصارم يحصل على "true "، وهو ليس قيمة منطقية، وتفشل المقارنة. بصمت، في اتجاه false.
في النهاية أظهرت العقدة ذلك حرفياً: Wrong type: 'true ’ is a string but was expecting a boolean
لماذا لم تعمل الإصلاحات الواضحة
حاولت التحويل داخل التعبير:
{{ String($(‘Extract Response’).first().json.shouldEscalate).trim().toBoolean() }}
فشل بالفعل. المسافة البيضاء ليست داخل التعبير — يتم إدخالها بعد }} أثناء عرض n8n الخاص به. لا شيء تفعله داخل الأقواس يمكنه الوصول إليها.
تبديل “Convert types where required” يغير وضع الفشل بدلاً من إصلاحه. في حالتي، إحدى الإعدادات وجهت كل شيء إلى true والآخر وجه كل شيء إلى false. كلاهما خاطئ؛ أحدهما فقط أكثر صراخاً.
الإصلاح الذي ينجح
توقف عن مقارنة القيمة المنطقية. أطلق كلمة رئيسية صريحة ومطابقة على نص:
القيمة: {{ $(‘Extract Response’).first().json.shouldEscalate ? “ESCALATE” : “NORMAL” }}
المشغل: String → contains
مطابقة: ESCALATE
تحويل الأنواع: off
"ESCALATE " لا تزال تحتوي على “ESCALATE”. "NORMAL " لا تحتوي عليها بأي طريقة. تصبح المسافة البيضاء الزائدة غير ضارة بدلاً من أن تكون قاتلة.
تم التحقق من الاتجاهات في كلا الاتجاهين على نفس الإصدار — الشرط true يوجه true، والشرط false يوجه false. يستحق القيام بكليهما؛ الاختبار في اتجاه واحد فقط هو نصف اختبار، وهذا الخلل قادر بشكل خاص على النجاح في اتجاه واحد أثناء الفشل في الآخر.
الإصدار العام
إذا كانت عقدة Switch أو IF تتخذ قراراً يهم فعلاً — تنبيهات أو تصعيد أو بوابات الامتثال، أي شيء حيث يكون أخذ الفرع الخاطئ بصمت مكلفاً — لا توجهها على قيمة منطقية خام. أطلق سلسلة نصية حارسة ومطابقة عليها.
“وضع الفشل هنا ليس خطأ. إنها عملية تنفيذ خضراء فعلت الشيء الخاطئ.”