أواجه صعوبة في الاختبار التكراري في منتصف سير العمل (خطوة العقدة)
ما أحاول القيام به: تشغيل العقد بعد نقطة معينة فقط (على سبيل المثال، عقدة Google Sheets ‘إلحاق صف’) دون تشغيل كل شيء في المنطقة العليا مرة أخرى.
ما حاولت القيام به:
تثبيت العقدة قبل Sheets - لا تزال العمليات في المنطقة العليا تعمل، فقط استبدلت البيانات المثبتة عند تلك العقدة
النقر على ‘تنفيذ الخطوة’ على عقدة في المنطقة السفلى - لا تزال العمليات في المنطقة العليا تعمل
يبدو أن “تنفيذ الخطوة” لا يحترم البيانات المخزنة مؤقتًا ما لم يكن هناك تشغيل كامل ناجح سابق.
هل هناك سير عمل موثوق لهذا؟ بعض الأسئلة:
هل التثبيت مفروض أن يمنع التنفيذ في المنطقة العليا، أم مجرد استبدال البيانات؟
هل يستخدم “تنفيذ الخطوة” مخرجات العقدة المخزنة مؤقتًا من تشغيل سابق، وإن كان الأمر كذلك، فلماذا يتطلب ذلك تشغيلًا كاملًا ناجحًا أولًا؟
هل تقسيم سير العمل إلى مسارات فرعية هو الحل الحقيقي الوحيد هنا أم أن هذا يحدث فقط لأن لديّ حلقات؟
أود فهم السلوك المقصود مقابل ما يحدث بالفعل.
يحتوي سير العملي على حلقة - أتساءل إذا كان هذا هو السبب الجذري، حيث قد يضطر n8n إلى إعادة تشغيل العمليات في المنطقة العليا لحل حالة الحلقة بدلًا من استخدام البيانات المخزنة مؤقتًا. شكرًا
معلومات حول إعداد n8n الخاص بي
إصدار n8n: 2.19.5
قاعدة البيانات (الافتراضي: SQLite): افتراضي
إعداد n8n EXECUTIONS_PROCESS: غير معروف، افتراضي ذاتي التشغيل
للإجابة على أسئلتك مباشرة: **التثبيت (Pinning) يستبدل البيانات، وهو لا يوقف تنفيذ العقد الأعلى.**العقد الأعلى تستمر في التنفيذ، لكن مخرجات العقدة المثبتة يتم استبدالها ببيانات مثبتة بدلاً من مخرجاتها الحقيقية. إذاً ملاحظتك صحيحة.
خطوة التنفيذ (النقر على عقدة معينة) تستخدم المخرجات المخزنة مؤقتاً من آخر تشغيل كامل للسير - وهذا هو السبب في أنها تتطلب تشغيلاً كاملاً ناجحاً أولاً. مع وجود حلقة في سير عملك، قد تتصرف خطوة التنفيذ بطريقة غير متوقعة لأن n8n تحتاج إلى حل سياق التنفيذ الكامل بما في ذلك حالة الحلقة.
الطريقة الأكثر موثوقية للاختبار المتكرر في منتصف السير هي: تشغيل السير الكامل مرة واحدة حتى الانتهاء، ثم استخدام خطوة التنفيذ فقط على العقدة السفلية التي تريد التكرار عليها. بدلاً من ذلك، يمكنك تقسيم سير عملك عند النقطة التي تريد الاختبار فيها واستخدام “اختبار” منفصل - سير فرعي يقبل محفز يدوي ببيانات عينة مشفرة مسبقاً - بهذه الطريقة يمكنك التكرار على المنطق السفلي بشكل معزول دون تفعيل الأعلى على الإطلاق.
أولاً، من المهم أن نفهم أن “تثبيت” البيانات لا يوقف فعلياً n8n عن سير المسار إلى عقدتك. فكّر في التثبيت باعتباره “استبدال نتيجة” وليس “اختصار.” عندما تثبت عقدة، فإنك تخبر n8n باستخدام إجابة محفوظة بدلاً من استدعاء واجهة برمجية (API) أو قاعدة بيانات، لكن النظام لا يزال يمشي عبر كل خطوة تؤدي إلى تلك النقطة للتأكد من أن كل شيء على ما يرام.
السبب في أن عقدك العليا لا تزال تعمل هو أن n8n تحتاج إلى فهم السياق الكامل لبياناتك. إذا أشارت عقدة في نهاية سير العمل إلى معلومة من البداية تماماً، فإن n8n لا يمكنها فقط أن تخمن ما كانت عليه. فهي تعيد تشغيل الخطوات السابقة لإعادة بناء “قصة” التنفيذ بحيث تبقى جميع الصيغ والمراجع الخاصة بك دقيقة.
حلقتك تجعل هذا أكثر تعقيداً. لأن الحلقات تتتبع أي “لفة” هي عليها (مثل العنصر 1 من 10)، فإن n8n لا يمكنها ببساطة القفز إلى منتصف واحدة. لمعرفة أي عنصر محدد تختبره حالياً، يشعر النظام أنه يجب إعادة تشغيل متحكم الحلقة من البداية لإنشاء الحالة الحالية وعدد التكرار.
للالتفاف حول هذا أثناء الاختبار، أسرع خدعة هي “كسر” الاتصال مؤقتاً. إذا ثبتت البيانات التي تحتاجها ثم قطعت اتصال تلك العقدة عن كل شيء خلفها، فإن n8n لم تعد تستطيع العثور على مسار للعودة إلى البداية. هذا يجبر النظام على التعامل مع عقدتك المثبتة كبداية سير العمل، مما يتيح لك اختبار العقد اللاحقة بعزلة تامة.
بالنسبة لحل أكثر دواماً، فكّر في تقسيم سير العمل الكبير إلى “سير عمل فرعية” أصغر. بنقل منطق جداول بيانات Google إلى سير عمل منفصل خاص به، يمكنك اختباره بشكل مستقل دون تشغيل الحلقات المعقدة أو خطوات جمع البيانات الثقيلة من عمليتك الرئيسية. يحول هذا دورة اختبار محبطة إلى تجربة نظيفة وموديولية أكثر بكثير.
إضافة إلى Alt+X الخاص بـ @kjooleng — بمجرد استخراج المرحلة اللاحقة إلى مسار عمل فرعي، أسقط Manual Trigger فيه مع pinData على المشغِّل نفسه. بهذه الطريقة يمكنك تكرار المرحلة الفرعية بعزلة تامة، والمسار الرئيسي لا يزال بإمكانه استدعاؤه عبر Execute Workflow في الإنتاج:
كلا المشغِّلين يغذيان نفس العقد اللاحقة. عند الاختبار → قم بتشغيل Manual Trigger وتتدفق العينة المثبتة؛ عند استدعاؤها من الأعلى → ينطلق Execute Workflow Trigger مع بيانات الحلقة الحقيقية. لا توجد عمليات تشغيل لمرحلة سابقة أثناء التكرار، بلا سياق أب يجب إعادة بناؤه.
التثبيت يحل محل مخرجات العقدة ويتخطى تشغيل تلك العقدة — إنه “استخدم هذه البيانات هنا”، وليس “تجميد كل شيء قبل هذا.” في التدفق الخطي البسيط، هذا يعني أن العقد الموجودة فوق الدبوس لا تحتاج إلى التشغيل، لكن لا توجد ضمانة بأن المحرك لن ينفذ العمليات الأعلى عندما يضطر إلى إعادة بناء السياق.
خطوة التنفيذ + الذاكرة المؤقتة: التنفيذ الجزئي يزود العقدة ببيانات التشغيل من آخر تنفيذ ناجح لما هو أعلاها. لهذا السبب تحتاج إلى تشغيل سابق كامل — البيانات المخزنة مؤقتاً موجودة فقط عندما ينتج شيء ما عنها. لا توجد بيانات مخزنة مؤقتاً (أو تم إلغاء صلاحيتها) → تقوم n8n بإعادة تشغيل العمليات الأعلى لإعادة إنتاجها.
الحلقة هي السبب الجذري. Loop Over Items / Split In Batches يجعل الرسم البياني دوري، والمنفذ الجزئي لا يستطيع “البدء من المنتصف” من حلقة بشكل نظيف — يجب عليه إعادة بناء حالة التكرار (الحزمة، التكرار الخلفي)، لذلك يعيد تشغيل الحلقة وما يغذيها بدلاً من الوثوق بلقطة واحدة مخزنة مؤقتاً.
ما يعمل فعلياً للاختبار التكراري في منتصف التدفق:
قم بتشغيل كامل واحد ناجح أولاً، ثم ثبّت العقدة قبل القسم الذي تعيد التكرار عليه مباشرة. بعد ذلك، “خطوة التنفيذ” في الأسفل ستستخدم البيانات المثبتة/المخزنة مؤقتاً — طالما أن المسار الذي تختبره لا يعود للتوجيه عبر الحلقة.
بالنسبة للتدفقات الثقيلة بالحلقات، انقل الجزء السفلي إلى سير عمل فرعي (عقدة Execute Workflow). ثم تختبر سير العمل الفرعي بمفرده مع إدخال مثبت/يدوي ولا تلمس الحلقة أبداً. ليست الخيار الوحيد، لكنها الأنظف — إنها تعزلك تماماً عن مشكلة حالة الحلقة هذه.
بديل سريع أثناء التكرار: قم بإسقاط عقدة Edit Fields (Set) مؤقتاً تصدر بعض عناصر العينات التمثيلية بدلاً من المنبع للحلقة، لذلك تمرّن منطق الجزء السفلي دون إعادة تشغيل الحلقة على الإطلاق.
إذن: التثبيت = استبدال البيانات، خطوة التنفيذ = تحتاج إلى تشغيل سابق من أجل ذاكرته المؤقتة، وإعادة التنفيذ التي تحاربها هي الحلقة. عزل منطق ما بعد الحلقة واختبار منتصف التدفق يصبح سهلاً بدون ألم.