راهنمای جامع نود Code n8n

قدرت‌نمایی با نود Code در n8n: راهنمای جامع جاوااسکریپت برای اتوماسیون‌های پیشرفته در 1404

نسخه صوتی این مقاله (هوش مصنوعی کارورا)

برخلاف تصور رایج، محدودیت اصلی ابزارهای Low-Code/No-Code مانند n8n، ضعف در اتصال به APIها یا کمبود نودهای آماده نیست.

محدودیت واقعی زمانی آشکار می‌شود که شما، به عنوان یک معمار فنی، با یک منطق تجاری (Business Logic) پیچیده و غیر استاندارد روبرو می‌شوید. سناریویی را تصور کنید که در آن یک API داخلی، داده‌ها را با ساختاری نامتعارف و نیازمند پاکسازی بازمی‌گرداند.

نودهای بصری مانند Set در این نقطه به بن‌بست می‌رسند. آن‌ها برای عملیات ساده و خطی طراحی شده‌اند، نه برای مدیریت منطق‌های تودرتو، تبدیل داده‌های پیچیده یا اجرای الگوریتم‌های خاص.

اینجاست که ورک‌فلو شما در پلتفرم اتوماسیون n8n از یک ابزار توانمندسازی به یک قفس دیجیتال تبدیل می‌شود. درد ناشی از این محدودیت، لحظه‌ای است که متوجه می‌شوید ابزار به جای شما تصمیم می‌گیرد.

نود Code، فراتر از یک ویژگی، یک بیانیه است: کنترل نهایی، همواره در دستان توسعه‌دهنده باقی می‌ماند. این نود، دریچه‌ای به موتور Node.js است که n8n بر پایه آن ساخته شده و به شما اجازه می‌دهد از محدودیت‌های رابط کاربری فراتر رفته و هر منطقی را که با جاوااسکریپت قابل پیاده‌سازی است، اجرا کنید.

وقتی Drag & Drop کافی نیست: چرا نودهای آماده n8n شما را محدود می‌کنند؟

محدودیت نودهای آماده n8n
زمانی که نودهای استاندارد برای منطق‌های تجاری پیچیده کافی نیستند.

در پروژه‌های واقعی، بارها با این سناریو مواجه شده‌ایم: فرض کنید در حال ساخت یک ورک‌فلو برای همگام‌سازی اطلاعات مشتریان از یک سامانه CRM ایرانی با پلتفرم حسابداری خود هستید. پاسخ API از CRM، یک آبجکت JSON است که در آن، سابقه خرید مشتریان به صورت یک رشته متنی (stringified JSON) در یکی از فیلدها قرار گرفته و تاریخ‌ها با فرمت غیراستاندارد شمسی ارائه شده‌اند.

نودهای استاندارد n8n در این سناریو فلج می‌شوند:

  • نود Set: تنها می‌تواند مقادیر را به صورت مستقیم از ورودی به خروجی نگاشت کند. توانایی پارس کردن یک رشته JSON داخلی یا تبدیل فرمت تاریخ را ندارد.
  • نود IF: تنها برای شرط‌های باینری ساده (true/false) مناسب است. نمی‌تواند یک منطق شرطی چندلایه (مثلاً «اگر مشتری VIP بود *و* مجموع خریدش در سه ماه گذشته از X بیشتر بود») را به سادگی پیاده کند.
  • نود Merge: برای ترکیب داده‌ها عالی است، اما هیچ قدرتی برای تغییر ساختار یا پاکسازی داده‌های ورودی ندارد.
  • شما به ابزاری نیاز دارید که بتواند رشته را به آبجکت JSON تبدیل کند، در میان آرایه خریدها حلقه بزند، تاریخ‌ها را استانداردسازی کند و در نهایت، یک خروجی تمیز و ساختاریافته تولید کند.

    تلاش برای انجام این کار با زنجیره‌ای از ده نود بصری، نه تنها ورک‌فلو را پیچیده و غیرقابل نگهداری می‌کند، بلکه در بسیاری از موارد اساساً غیرممکن است. این بن‌بست، نقطه تولد نیاز به نود Code است.

    آناتومی نود Code: آشنایی با محیط کدنویسی شما در n8n

    محیط کدنویسی نود Code
    آشنایی با ساختار ورودی، خروجی و محیط کدنویسی در نود Code.

    نود Code یک محیط ایزوله مبتنی بر Node.js در اختیار شما قرار می‌دهد. درک ساختار ورودی و خروجی آن برای استفاده موثر، حیاتی است.

    *(توضیح تصویری: یک اسکرین‌شات از محیط نود Code که بخش‌های مختلف آن با فلش و متن فارسی مشخص شده‌اند: ۱. پنل کدنویسی، ۲. متغیرهای ورودی گلوبال، ۳. پنل خروجی و دیباگ)*

    داده‌ها از نودهای قبلی به صورت یک آرایه از آیتم‌ها به نود Code وارد می‌شوند. این آرایه items نام دارد و متغیر اصلی شماست.

  • items: آرایه‌ای از تمام آیتم‌های ورودی. هر آیتم یک آبجکت است که معمولاً یک کلید json و یک کلید binary دارد. داده‌های شما تقریباً همیشه در items[i].json قرار دارند.
  • $json: یک میان‌بر (shortcut) برای دسترسی به داده‌های اولین آیتم ورودی است. در واقع معادل items[0].json می‌باشد. اگر مطمئن هستید که نود شما همیشه فقط یک آیتم ورودی خواهد داشت، استفاده از $json خوانایی کد را افزایش می‌دهد.
  • $item(index): یک تابع کمکی برای دسترسی ساده‌تر به داده‌های یک آیتم خاص در حلقه است. $item(i) معادل items[i].json است.
  • خروجی نود Code
    کد شما باید یک آرایه از آبجکت‌ها را بازگرداند (return). هر آبجکت در این آرایه، به یک آیتم خروجی برای نود بعدی تبدیل می‌شود. ساختار استاندارد هر آبجکت خروجی، { json: yourDataObject } است.

    مثال پایه‌ای برای شروع: فرض کنید نود قبلی، یک آبجکت ساده { "name": "Arash", "level": "admin" } را ارسال کرده است. کد زیر این داده را دریافت کرده و یک فیلد جدید به آن اضافه می‌کند.

    // Data from the previous node is available in the 'items' array.
    // $json is a shorthand for items[0].json
    // Create a new object based on the input data.
    
    const outputData = {
      ...$json, // Copy all fields from the input
      processed: true,
      timestamp: new Date().toISOString()
    };
    
    // The node MUST return an array of objects.
    // Each object will become an output item for the next node.
    return [{
      json: outputData
    }];
    


    این ساختار ساده، سنگ بنای تمام عملیات پیچیده‌ای است که در ادامه بررسی خواهیم کرد.

    جادوی جاوااسکریپت: ۳ مثال عملی برای حل مشکلات واقعی

    پاکسازی داده API با جاوااسکریپت
    تبدیل داده‌های خام API به خروجی ساختاریافته و تمیز.

    در تجربه ما در کارورا، قدرت واقعی نود Code در حل مشکلات بومی و خاص بازار ایران آشکار می‌شود. در ادامه سه سناریوی واقعی را پیاده‌سازی می‌کنیم.

    ۱. پاکسازی و فرمت‌دهی داده API یک درگاه پرداخت

    فرض کنید از API یک درگاه پرداخت ایرانی استعلام وضعیت یک تراکنش را گرفته‌اید و پاسخ زیر را دریافت می‌کنید. داده‌ها نامرتب، دارای فیلدهای اضافی و با نام‌گذاری غیراستاندارد هستند.

    ورودی JSON (از نود HTTP Request):

    {
      "status_code": 200,
      "data": {
        "trans_id": "TR-10928B3",
        "amount_rials": 5000000,
        "card_info": {
          "masked_pan": "6037---1111",
          "bank": "Melli"
        },
        // Stringified JSON inside a string
        "customer_details": "{\"name\": \"شرکت کارورا\", \"phone\": \"09120000000\"}",
        "extra_data": null,
        "payment_timestamp": "1403/04/01 15:30:00"
      }
    }
    


    هدف: استخراج اطلاعات کلیدی، تغییر نام فیلدها به فرمت camelCase، پارس کردن customer_details و تبدیل مبلغ از ریال به تومان.

    ورک‌فلو: Webhook -> HTTP Request (Get Transaction) -> Code -> Google Sheets

    ⚠️ نکته امنیتی: هنگام استفاده از نود Webhook در محیط پروداکشن، حتماً از بخش تنظیمات نود، گزینه Authentication را روی Basic Auth یا Header Auth تنظیم کرده و یک توکن امن برای آن تعریف کنید تا از دریافت درخواست‌های غیرمجاز جلوگیری شود.

    کد داخل نود Code:

    // Access the nested data object from the first input item
    const rawData = $json.data;
    
    // Parse the stringified JSON for customer details
    // Use a try-catch block to handle cases where parsing might fail
    let customerInfo = {};
    
    try {
      customerInfo = JSON.parse(rawData.customer_details);
    } catch (error) {
      console.log('Could not parse customer_details:', rawData.customer_details);
    }
    
    // Create the clean, structured output object
    const cleanTransaction = {
      transactionId: rawData.trans_id,
      amountToman: rawData.amount_rials / 10,
      customerName: customerInfo.name || 'N/A', // Provide a default value
      customerPhone: customerInfo.phone || 'N/A',
      maskedCard: rawData.card_info.masked_pan,
      paymentDate: rawData.payment_timestamp
    };
    
    // Return the cleaned data as a single output item
    return [{
      json: cleanTransaction
    }];
    


    نتیجه: نود Google Sheets اکنون یک ردیف تمیز و استاندارد با فیلدهای transactionId, amountToman و… دریافت می‌کند که مستقیماً قابل استفاده است.

    کد را کپی نکنید، ورک‌فلو را وارد کنید!

    این ورک‌فلو شامل نودهای آماده برای پاکسازی داده API (مثال بالا) است. آن را در n8n خود import کرده و فوراً پروژه خود را سرعت ببخشید.

    دانلود فایل JSON ورک‌فلو →

    ۲. اجرای منطق شرطی پیچیده برای مدیریت سفارش‌ها

    یک فروشگاه آنلاین می‌خواهد بر اساس وضعیت کاربر و جزئیات سفارش، عملیات متفاوتی انجام دهد. زنجیره‌سازی چند نود IF این ورک‌فلو را به یک اسپاگتی بصری تبدیل می‌کند.

    ورودی JSON:

    {
      "orderId": "ORD-5541",
      "totalAmount": 2500000, // Toman
      "userType": "VIP", // Can be 'VIP', 'New', 'Regular'
      "couponCode": null
    }
    

    هدف:

  • اگر کاربر VIP و مبلغ سفارش بالای ۱ میلیون تومان بود، تگ high-priority اضافه شود.
  • اگر کاربر New و کد تخفیف WELCOME2026 را داشت، تگ welcome-offer اضافه شود.
  • در غیر این صورت، تگ standard-processing اعمال شود.
  • ورک‌فلو: Webhook (New Order) -> Code -> Router (Based on 'tag')

    کد داخل نود Code:

    let tag = 'standard-processing';
    let notification = 'Process as standard order.';
    
    // Condition 1: VIP high-value order
    if (order.userType === 'VIP' && order.totalAmount > 1000000) {
      tag = 'high-priority';
      notification = `High-priority order #${order.orderId} from a VIP customer. Requires immediate attention.`;
    }
    
    // Condition 2: New user with welcome coupon
    else if (order.userType === 'New' && order.couponCode === 'WELCOME2026') {
      tag = 'welcome-offer';
      notification = `New user #${order.orderId} used the welcome offer.`;
    }
    
    // Prepare the output object
    const output = {
      ...order, // Pass through original order data
      processingTag: tag,
      internalNotification: notification
    };
    
    return [{
      json: output
    }];
    

    نتیجه: نود Router پس از این کد، می‌تواند به سادگی بر اساس مقدار فیلد processingTag جریان کار را به سه شاخه کاملاً مجزا هدایت کند. تمام منطق پیچیده در یک نود کپسوله شده است.

    ۳. تولید گزارش متنی داینامیک برای ارسال به تلگرام

    شما می‌خواهید روزانه یک خلاصه عملکرد برای تیم فروش در تلگرام ارسال کنید. داده‌ها از دو منبع مختلف می‌آیند: یک API فروش و یک Google Sheet حاوی اهداف فروش.

    ورودی (پس از نود Merge): دو آیتم در آرایه items وجود دارد.

  • items[0].json: { "dailySales": 45000000, "newLeads": 15 } (از API)
  • items[1].json: { "salesTarget": 50000000, "leadTarget": 10 } (از Google Sheets)
  • هدف: تولید یک پیام متنی خوانا که این داده‌ها را ترکیب و مقایسه کند.

    ورک‌فلو: Cron -> HTTP Request (Get Sales) -> Google Sheets (Get Targets) -> Merge -> Code -> Telegram

    کد داخل نود Code:

    // Access data from the two different input items
    const salesData = items[0].json;
    const targetData = items[1].json;
    
    // Calculate performance metrics
    const salesPercentage = ((salesData.dailySales / targetData.salesTarget) * 100).toFixed(1);
    const leadPerformance = salesData.newLeads >= targetData.leadTarget ? '✅' : '⚠️';
    
    // Get current date in Jalali format
    const reportDate = new Date().toLocaleDateString('fa-IR');
    
    // Generate the dynamic report text using template literals
    const reportMessage = `
    گزارش عملکرد روزانه – ${reportDate}
    فروش امروز: ${salesData.dailySales.toLocaleString('fa-IR')} تومان
    هدف فروش: ${targetData.salesTarget.toLocaleString('fa-IR')} تومان
    درصد تحقق هدف: ${salesPercentage}%
    سرنخ‌های جدید: ${salesData.newLeads} عدد
    عملکرد جذب سرنخ: ${leadPerformance}
    #گزارش_روزانه #فروش
    `;
    
    // The Telegram node needs the message in a specific field
    return [{
      json: {
        text: reportMessage,
        chatId: '-100123456789' // Your Telegram Chat ID
      }
    }];
    


    گزارش عملکرد روزانه – ${reportDate}

  • فروش امروز: ${salesData.dailySales.toLocaleString(‘fa-IR’)} تومان
  • هدف فروش: ${targetData.salesTarget.toLocaleString(‘fa-IR’)} تومان
  • درصد تحقق هدف: ${salesPercentage}%
  • سرنخ‌های جدید: ${salesData.newLeads} عدد
  • عملکرد جذب سرنخ: ${leadPerformance}
  • گزارش_روزانه فروش

    // The Telegram node needs the message in a specific field, e.g., 'text'
    return [{
      json: {
        text: reportMessage,
        chatId: '-100123456789' // Your Telegram Chat ID
      }
    }];
    

    تکنیک‌های پیشرفته: کار با حلقه‌ها و مدیریت خطا در نود Code

    مدیریت خطا در نود Code
    استفاده از تکنیک‌های پیشرفته برای ساخت ورک‌فلوهای پایدار و مقاوم.

    وقتی با مجموعه‌ای از داده‌ها (مثلاً لیست محصولات در یک فاکتور) سر و کار دارید، حلقه‌ها ابزار اصلی شما خواهند بود. همچنین، تضمین پایداری ورک‌فلو در مواجهه با داده‌های غیرمنتظره، نیازمند مدیریت خطا است.

    پردازش آرایه‌ها با حلقه‌ها

    فرض کنید ورودی شما یک سفارش شامل آرایه‌ای از محصولات است و می‌خواهید مجموع مبلغ سفارش را محاسبه کنید.

    ورودی JSON:

    {
      "orderId": "ORD-5542",
      "items": [
        { "product": "A", "price": 50000, "quantity": 2 },
        { "product": "B", "price": 120000, "quantity": 1 },
        { "product": "C", "price": 75000, "quantity": 3 }
      ]
    }
    

    کد برای محاسبه مجموع:

    const order = $json;
    
    // A more functional approach using Array.reduce()
    // This is often preferred for its conciseness and readability
    const totalAmountWithReduce = order.items.reduce((accumulator, currentItem) => {
      return accumulator + (currentItem.price * currentItem.quantity);
    }, 0); // 0 is the initial value of the accumulator
    
    const output = {
      ...order,
      calculatedTotal: totalAmountWithReduce
    };
    
    return [{
      json: output
    }];
    

    این کد نشان می‌دهد چگونه می‌توان بر روی آرایه‌ای از آیتم‌های داخلی یک ورودی تکرار کرده و یک مقدار تجمعی را محاسبه نمود.

    مدیریت خطا با try...catch

    یک ورک‌فلو قدرتمند، ورک‌فلویی است که در مقابل خطاهای غیرمنتظره مقاوم باشد. اگر کد شما تلاش کند به یک پراپرتی که وجود ندارد دسترسی پیدا کند (مثلاً user.address.city وقتی address تعریف نشده)، کل ورک‌فلو متوقف می‌شود. بلوک try...catch از این فاجعه جلوگیری می‌کند.

    سناریو: پردازش داده کاربری که ممکن است پروفایل کاملی نداشته باشد.

    const user = $json.user;
    let shippingCity = 'Not Provided';
    
    try {
      // This line will throw an error if 'address' is undefined
      shippingCity = user.address.city;
    } catch (error) {
      // This code executes only if an error occurs in the try block
      console.log(Error accessing city for user ${user.id}. Defaulting.);
      // The 'shippingCity' variable remains 'Not Provided'
    }
    
    const output = {
      userId: user.id,
      targetCity: shippingCity,
    };
    
    return [{
      json: output
    }];
    

    با این الگو، حتی اگر داده ورودی ناقص باشد، ورک‌فلو متوقف نشده و با یک مقدار پیش‌فرض به کار خود ادامه می‌دهد.

    بهترین شیوه‌ها (Best Practices) برای کدنویسی در n8n

    راهنمای جامع نود Code n8n
    عبور از محدودیت‌های بصری n8n با قدرت کدنویسی جاوااسکریپت.
  • کامنت‌گذاری، وظیفه است نه انتخاب: کدی که امروز برای شما واضح است، شش ماه دیگر یک معما خواهد بود. منطق‌های پیچیده را همیشه با کامنت توضیح دهید.
  • خوانایی کد را در اولویت قرار دهید: از نام‌های معنادار برای متغیرها استفاده کنید (cleanData بهتر از d است).
  • مرز بین نود Code و نود اختصاصی را بشناسید: نود Code برای منطق‌های مختص یک ورک‌فلو ایده‌آل است. اگر در حال کپی کردن یک کد پیچیده در چندین ورک‌فلو هستید، زمان آن رسیده که یک نود اختصاصی (Custom Node) ایجاد کنید.
  • امنیت داده را جدی بگیرید: هرگز اطلاعات حساس مانند کلیدهای API را مستقیماً در کد خود قرار ندهید. همیشه از سیستم مدیریت اعتبار (Credentials) داخلی n8n استفاده کنید.
  • نتیجه‌گیری: از یک کاربر ساده به یک معمار اتوماسیون تبدیل شوید

    نود Code در n8n صرفاً یک ابزار نیست؛ یک فلسفه است. فلسفه‌ای که می‌گوید هیچ محدودیتی نباید مانع خلاقیت یک توسعه‌دهنده برای حل یک مشکل واقعی شود.

    این نود، مرز بین یک کاربر ابزار که در چارچوب‌ها کار می‌کند و یک معمار اتوماسیون که سیستم‌های منحصربه‌فرد طراحی می‌کند را از بین می‌برد. با تسلط بر جاوااسکریپت در این محیط، شما دیگر به نودهای موجود محدود نیستید؛ شما کنترل کامل بر جریان داده، منطق پردازش و ساختار خروجی را در دست می‌گیرید. این قدرت به شما اجازه می‌دهد تا پیچیده‌ترین چالش‌های کسب‌وکار خود را به فرآیندهای خودکار، هوشمند و مقیاس‌پذیر تبدیل کنید.

    سوالات متداول

    آیا جاوااسکریپت تنها زبان قابل استفاده در نود Code است؟

    بله. محیط اجرایی نود Code بر پایه Node.js است و به طور انحصاری از جاوااسکریپت پشتیبانی می‌کند. شما می‌توانید از سینتکس‌های مدرن ES6+ مانند async/await و destructuring استفاده کنید.

    آیا می‌توانم از پکیج‌های npm خارجی (مانند moment-jalaali) استفاده کنم؟

    بله، اما نیازمند تنظیمات پیشرفته است. شما باید متغیر محیطی NODE_CODE_ALLOW_EXTERNAL را در سمت سرور n8n خود تنظیم کنید. این کار به شما اجازه می‌دهد تا ماژول‌های npm مورد نیازتان را require کنید.

    تفاوت نود Code با نودهای Function و Function Item چیست؟

    نودهای Function و Function Item نسخه‌های قدیمی‌تر و محدودتر هستند. نود Code مدرن‌تر و قدرتمندتر است زیرا کل مجموعه آیتم‌های ورودی را به صورت یک آرایه (items) دریافت می‌کند و به شما کنترل کامل بر روی کل بچ داده‌ها را می‌دهد. توصیه ما در کارورا استفاده انحصاری از نود Code است.

    چگونه می‌توانم کدم را داخل نود Code دیباگ کنم؟

    ساده‌ترین روش استفاده از console.log() است. شما می‌توانید هر متغیری را در کد خود لاگ کنید. هنگام اجرای دستی نود، خروجی console.log در پنل “Console” مرورگر شما (Developer Tools) نمایش داده می‌شود.

    یک چالش اتوماسیون پیچیده‌تر دارید؟

    اگر ورک‌فلو شما شامل منطق‌های تجاری خاص، اتصال به سیستم‌های قدیمی یا نیازمند پایداری بالا است، یک گفتگوی ۱۵ دقیقه‌ای با معماران اتوماسیون کارورا می‌تواند راهگشای شما باشد.

    رزرو جلسه استراتژی رایگان →

    نوشته های مرتبط