كيف من الممكن لعقدة واحدة عدم التنفيذ؟

صِفْ المشكلة/الخطأ/السؤال
لدي عقدة تتفرع إلى فرعين متوازيين. يبدأ كل فرع بعقدة Data Table “Get”، وكلا عقدتي Get تتلقيان نفس عنصر الإدخال بالضبط من العقدة الأب المشتركة.
إحدى عقد Get المتوازية تعمل بشكل جيد. الأخرى ببساطة لا تُنفَّذ على الإطلاق. والشيء المضحك هو أن الفرق الوحيد بين العقدتين هو الجدول الذي تشير إليه. كل شيء آخر متطابق، نفس الإدخال، نفس العملية، نفس الإعدادات.
لقد تحققت بالفعل من الأشياء الواضحة:

  • تم التحقق من وجود الجدول الذي تشير إليه العقدة الفاشلة.
  • تم التحقق من البيانات داخل ذلك الجدول، إنها موجودة.
  • أضفت شرطًا (مرشح) إلى العقدة، لم يساعد.
  • حاولت نقل العقدة على لوحة الرسم، لم يساعد.
  • اشتبهت في أن العقدة ببساطة لم يكن لديها وقت كافٍ للتنفيذ (نوع من الوقت/المنافسة)، فتحققت من ذلك بعناية. هذا ليس هو الحال.
  • أعدت إنشاء العقدة من الصفر، لم يساعد.
  • أعدت توصيلها بالجدول، لم يساعد.
  • غيرت اختيار الجدول من “اختر من القائمة” إلى “بواسطة المعرّف”، وأيضًا إلى “بالاسم”، لم يساعد.

الشيء الوحيد الذي جعلها تعمل بطريقة ما كان نقل العقدة أسفل السلسلة بكثير، تقريبًا 10 عقد لاحقًا. ثم حاولت نقلها 5 عقد فقط، وعقدة واحدة للخلف، وتوقفت عن العمل مرة أخرى. إذن موضع العقدة في السلسلة يبدو أنه مهم، وهو ما لا أفهمه لعقدة تقرأ جدولًا فقط.

هذا يصبح فشلًا حقيقيًا عندما تشير عقدة لاحقة إلى العقدة بالاسم باستخدام $('Get node B').all(). بما أن تلك العقدة لم تُنفَّذ أبدًا، تُرجع المرجعية لا شيء، في حين أن عقدة Get الشقيقة على نفس الإدخال تعمل بشكل مثالي.
لماذا ترفض عقدة Get المتوازية واحدة التنفيذ بينما تعمل الشقيقة بنفس الإدخال بشكل جيد، ولماذا يؤدي نقلها فقط أسفل السلسلة بكثير إلى إصلاح المشكلة؟

ما هي رسالة الخطأ (إن وجدت)؟
لا توجد رسالة خطأ على العقدة Get نفسها، إنها ببساطة لا تعمل. ثم تفشل العقدة اللاحقة لأن العقدة المُشار إليها لم تُنفَّذ أبدًا.

شارك الإخراج الذي أرجعته آخر عقدة

(Get node A: تُرجع صفوفها كما هو متوقع. Get node B، نفس الإدخال: لا توجد عملية، لا إخراج.)

معلومات حول إعداد n8n الخاص بك

  • إصدار n8n: 2.25.7
  • قاعدة البيانات (الافتراضية: SQLite): n8n الافتراضية
  • تشغيل n8n عبر (Docker، npm، سحابة n8n، تطبيق سطح المكتب): سحابة n8n
  • نظام التشغيل: سحابة n8n

@pohgen المشكلة ليست في العقدة، بل في ترتيب تنفيذ الفروع في n8n. منذ الإصدار 1.0، يقوم n8n بتشغيل الفروع المتوازية واحداً تلو الآخر، من الأعلى إلى الأسفل بناءً على موضع الكانفاس، وينهي واحداً بالكامل قبل الانتقال إلى التالي.

Validate Input يتفرع إلى ثلاثة Gets. يقوم n8n بتشغيل الأعلى، ثم الأوسط (Get Routing Rows) وكل ما يليه بما فيه العقدة التي تقوم بـ $(‘Get Email Aliases’).all()، وفقط بعد ذلك الفرع السفلي. لذا يتم تشغيل هذا المرجع قبل أن يعمل Get Email Aliases، ويعيد نتيجة فارغة، والعقدة تبدو وكأنها لم تُنفذ أبداً. نقلها حوالي 10 عقد لأسفل يضعها في الفرع الرئيسي أمام المرجع، لذا يعمل أولاً، وهذا هو تأثير الموضع.

الحل: لا تستخدم المراجع عبر الفروع المتوازية. ضع Get Email Aliases مباشرة قبل حيث تستخدمه، أو أضف عقدة Merge بحيث تنتهي جميع الفروع قبل تشغيل أي شيء لاحق، وهذا ما توصي به مستندات n8n.

مرحباً @pohgen

لإصلاح هذا بشكل صحيح والحفاظ على سير عملك نظيفاً، يجب عليك إخبار n8n بشكل صريح بأن البيانات من الفروع المتوازية مطلوبة من خلال ربطها معاً.

  1. أضف عقدة Merge بعد فروعك المتوازية.
  2. قم بتوصيل مخرج فرعك “الذي يعمل” (على سبيل المثال، Get All Candidate Templates) إلى المدخل الأول من عقدة Merge.
  3. قم بتوصيل مخرج فرعك “الذي يفشل” (على سبيل المثال، Get Routing Rows) إلى المدخل الثاني من عقدة Merge.
  4. اضبط وضع عقدة Merge على “الانتظار حتى وصول جميع المدخلات” (أو “الدمج” إذا كنت تدمج البيانات).
  5. ضع عقدتك الموجودة في الأسفل بعد عقدة Merge هذه.

بفعل هذا، تقوم بإنشاء اتصال فعلي يحمي الفرع من إزالته، مما يضمن أن المحرك يعترف به كجزء ضروري من التنفيذ.

هل ساعدك هذا؟