در بسیاری از Workflowهای n8n، نودهای آماده مانند Edit Fields، IF، Switch و Merge تمام نیازهای ما را برطرف میکنند. اما گاهی لازم است دادهها را با منطق اختصاصی پردازش کنیم؛ مثلاً مجموع قیمت محصولات را محاسبه کنیم، اطلاعات چند فیلد را به یکدیگر تبدیل کنیم، دادههای نامعتبر را شناسایی کنیم یا خروجی یک API را به ساختار موردنیاز خود تغییر دهیم.
در چنین شرایطی، Code Node در n8n به شما اجازه میدهد کد JavaScript اجرا کنید و منطق دلخواهتان را مستقیماً داخل Workflow پیادهسازی کنید.
در این مقاله یاد میگیریم Code Node چیست، چگونه از آن استفاده کنیم، چه تفاوتی میان حالتهای اجرای آن وجود دارد و چگونه با چند مثال کاربردی، دادهها را پردازش کنیم.
Code Node در n8n چیست؟
Code Node یکی از نودهای n8n است که برای اجرای کد سفارشی استفاده میشود. با استفاده از آن میتوانید عملیاتهایی را انجام دهید که پیادهسازی آنها با نودهای آماده دشوارتر است یا به منطق برنامهنویسی نیاز دارند.
برای مثال، با Code Node میتوانید:
- محاسبات ریاضی روی دادهها انجام دهید.
- فیلدهای جدید به اطلاعات ورودی اضافه کنید.
- ساختار دادههای JSON را تغییر دهید.
- چند آیتم را بررسی و خلاصهسازی کنید.
- دادههای نامعتبر یا ناقص را شناسایی کنید.
- اطلاعات را برای ارسال به API آماده کنید.
- منطقهای شرطی و پردازشهای اختصاصی بنویسید.
این نود از JavaScript استفاده میکند؛ بنابراین آشنایی مقدماتی با متغیرها، شرطها، آرایهها، اشیاء و توابع در JavaScript به شما کمک میکند از امکانات آن بهتر استفاده کنید.
البته برای شروع لازم نیست برنامهنویس حرفهای باشید. با چند دستور ساده میتوانید بسیاری از کارهای کاربردی را انجام دهید.
چه زمانی از Code Node استفاده کنیم؟
فرض کنید اطلاعات یک سفارش از API دریافت شده و شامل فیلدهای زیر است:
{
"order_id": 1250,
"price": 850000,
"shipping_cost": 50000
}
اگر بخواهید مبلغ نهایی سفارش را محاسبه کنید، میتوانید از نودهای آماده یا Expression استفاده کنید. اما اگر محاسبات پیچیدهتر شوند، ممکن است Code Node گزینه مناسبتری باشد.
برای مثال، میتوانیم مبلغ نهایی را با JavaScript محاسبه کنیم:
const total = $json.price + $json.shipping_cost;
return {
json: {
...$json,
total
}
};
خروجی شامل اطلاعات قبلی سفارش بهعلاوه فیلد total خواهد بود.
با این حال، Code Node همیشه بهترین انتخاب نیست. اگر بتوانید عملیات سادهای را با Edit Fields یا Expression انجام دهید، معمولاً استفاده از همان ابزار آماده، Workflow را خواناتر و نگهداری آن را آسانتر میکند.
قاعده پیشنهادی: برای تغییرات ساده از نودهای آماده استفاده کنید و زمانی به سراغ Code Node بروید که به منطق سفارشی یا پردازش پیچیدهتر نیاز دارید.
آموزش ساخت اولین Code Node در n8n
در این بخش یک Workflow ساده میسازیم و با استفاده از JavaScript، اطلاعات یک سفارش را پردازش میکنیم.
مرحله اول: ایجاد Workflow
وارد محیط n8n شوید و یک Workflow جدید بسازید.
یک نود Manual Trigger به Workflow اضافه کنید تا بتوانید آن را بهصورت دستی اجرا کنید.
سپس یک نود Edit Fields اضافه کنید و اطلاعات آزمایشی زیر را در آن قرار دهید:
{
"order_id": 1250,
"product_name": "Keyboard",
"price": 850000,
"shipping_cost": 50000
}
ساختار اولیه Workflow:
Manual Trigger → Edit Fields
مرحله دوم: اضافهکردن Code Node
یک نود Code به Workflow اضافه کنید و آن را بعد از Edit Fields قرار دهید.
ساختار Workflow اکنون به این صورت است:
Manual Trigger → Edit Fields → Code
نود Code را باز کنید. در این قسمت میتوانید زبان برنامهنویسی و حالت اجرای کد را انتخاب کنید. در آموزش حاضر، زبان JavaScript را به کار میبریم.
مرحله سوم: نوشتن کد JavaScript
کد زیر را در Code Node قرار دهید:
const total = $json.price + $json.shipping_cost;
return {
json: {
...$json,
total: total
}
};
این کد سه کار انجام میدهد:
- مقدار قیمت محصول را میخواند.
- هزینه ارسال را به قیمت اضافه میکند.
- فیلد
totalرا به اطلاعات خروجی اضافه میکند.
در این مثال، فرض کردهایم هر دو مقدار عددی هستند. اگر دادهها از یک API دریافت میشوند، بهتر است نوع دادهها را نیز بررسی کنید؛ زیرا ممکن است مبلغ بهصورت رشته دریافت شود.
مرحله چهارم: اجرای Workflow
Workflow را اجرا کنید و خروجی Code Node را بررسی کنید.
خروجی مورد انتظار:
{
"order_id": 1250,
"product_name": "Keyboard",
"price": 850000,
"shipping_cost": 50000,
"total": 900000
}
به این ترتیب، بدون نیاز به نودهای متعدد، محاسبه را با چند خط JavaScript انجام دادهایم.
آشنایی با ساختار دادهها در Code Node
برای استفاده صحیح از Code Node باید بدانید n8n چگونه دادهها را بین نودها منتقل میکند.
دادههای n8n معمولاً به شکل مجموعهای از آیتمها منتقل میشوند. هر آیتم دارای یک بخش json است که اطلاعات اصلی آن را نگهداری میکند.
برای مثال:
{
json: {
name: "Ali",
age: 30
}
}
در کد بالا، اطلاعات اصلی درون json قرار دارد.
متغیر $json چیست؟
در Code Node، متغیر $json برای دسترسی راحت به داده JSON آیتم جاری استفاده میشود؛ بهویژه در حالت Run Once for Each Item.
برای مثال:
const name = $json.name;
const age = $json.age;
return {
json: {
name,
age
}
};
این کد مقدار فیلدهای name و age را میخواند و در خروجی قرار میدهد.
اگر داده ورودی چنین باشد:
{
"name": "Sara",
"age": 28,
"city": "Tehran"
}
خروجی کد بالا فقط شامل name و age خواهد بود؛ زیرا فیلد city را در خروجی تعریف نکردهایم.
اگر بخواهید تمام فیلدهای قبلی را حفظ کنید، میتوانید از عملگر Spread استفاده کنید:
return {
json: {
...$json,
verified: true
}
};
در این مثال، تمام فیلدهای ورودی حفظ میشوند و فیلد جدید verified نیز به آنها اضافه میشود.
نکته: $json در این مثالها برای حالت اجرای هر آیتم به کار رفته است. در حالت پردازش همه آیتمها بهصورت یکجا، معمولاً از $input.all() برای دریافت مجموعه ورودی استفاده میکنیم.
تفاوت Run Once for Each Item و Run Once for All Items
یکی از مهمترین تنظیمات Code Node، حالت اجرای کد است.
در n8n معمولاً دو حالت اصلی در اختیار دارید:
- Run Once for Each Item: کد برای هر آیتم ورودی بهصورت جداگانه اجرا میشود.
- Run Once for All Items: کد یک بار اجرا میشود و میتواند مجموعه آیتمهای ورودی را پردازش کند.
انتخاب حالت درست به هدف شما بستگی دارد.
| ویژگی | Run Once for Each Item | Run Once for All Items |
|---|---|---|
| تعداد دفعات اجرای کد | برای هر آیتم | یک بار برای مجموعه ورودی |
| دسترسی رایج به داده | $json | $input.all() |
| کاربرد | تغییر اطلاعات هر رکورد | محاسبه مجموع یا پردازش مجموعه |
| نمونه کاربرد | اضافهکردن فیلد به هر محصول | محاسبه مجموع قیمت محصولات |
در ادامه، هر دو حالت را با مثال بررسی میکنیم.
مثال اول: پردازش هر آیتم بهصورت جداگانه
فرض کنید سه محصول دارید و میخواهید برای هر محصول، مالیات ۱۰ درصد محاسبه کنید.
داده ورودی میتواند شامل سه آیتم مستقل باشد:
[
{
"product": "Keyboard",
"price": 1000000
},
{
"product": "Mouse",
"price": 500000
},
{
"product": "Monitor",
"price": 5000000
}
]
در حالت Run Once for Each Item، کد زیر را بنویسید:
const tax = $json.price * 0.10;
return {
json: {
...$json,
tax,
final_price: $json.price + tax
}
};
n8n کد را برای هر آیتم اجرا میکند.
در نتیجه، هر محصول با دو فیلد جدید tax و final_price برگردانده میشود.
برای مثال، خروجی محصول اول شامل این مقادیر خواهد بود:
{
"product": "Keyboard",
"price": 1000000,
"tax": 100000,
"final_price": 1100000
}
این روش برای محاسبه قیمت، آمادهسازی اطلاعات مشتریان، تبدیل فیلدها و پردازش جداگانه رکوردها مناسب است.
مثال دوم: پردازش همه آیتمها بهصورت یکجا
حالا فرض کنید میخواهیم مجموع قیمت تمام محصولات را محاسبه کنیم.
در این حالت، گزینه Run Once for All Items را انتخاب کنید و کد زیر را بنویسید:
const items = $input.all();
const total = items.reduce((sum, item) => {
return sum + Number(item.json.price || 0);
}, 0);
return [
{
json: {
product_count: items.length,
total_price: total
}
}
];
در این کد:
$input.all()تمام آیتمهای ورودی را دریافت میکند.reduce()مجموع قیمتها را محاسبه میکند.Number()تلاش میکند مقدار قیمت را به عدد تبدیل کند.- در پایان، یک آیتم شامل تعداد محصولات و مجموع قیمتها برگردانده میشود.
برای سه محصول مثال قبل، خروجی به این شکل خواهد بود:
{
"product_count": 3,
"total_price": 6500000
}
این روش برای گزارشگیری، محاسبه آمار کلی، شمارش رکوردها و پردازش مجموعهای از دادهها بسیار مفید است.
توجه: استفاده از Number() بهتنهایی اعتبارسنجی کامل دادهها نیست. اگر داده نامعتبر باشد، ممکن است نتیجه NaN شود. در فرآیندهای مالی، بهتر است مقادیر ورودی را صریح و دقیق اعتبارسنجی کنید.
آموزش کار با آرایهها در Code Node
یکی از کاربردهای مهم JavaScript در n8n، پردازش آرایههاست.
فرض کنید اطلاعات چند سفارش در قالب آیتمهای جداگانه وارد Workflow شدهاند و میخواهید فقط سفارشهایی را نگه دارید که مبلغ آنها بیشتر از یک میلیون تومان است.
اگر قصد دارید کل مجموعه ورودی را پردازش کنید، حالت Run Once for All Items را انتخاب کرده و از کد زیر استفاده کنید:
const items = $input.all();
const filteredItems = items.filter((item) => {
return Number(item.json.amount) > 1000000;
});
return filteredItems;
در این مثال، filter() فقط آیتمهایی را نگه میدارد که مقدار amount آنها بیشتر از یک میلیون باشد.
برای مثال، اگر سه سفارش با مبالغ زیر داشته باشیم:
- سفارش اول: ۸۰۰ هزار تومان
- سفارش دوم: ۱ میلیون و ۵۰۰ هزار تومان
- سفارش سوم: ۲ میلیون تومان
دو سفارش آخر در خروجی باقی میمانند.
این روش برای فیلترکردن دادهها بر اساس شرطهای اختصاصی مناسب است. البته اگر شرط سادهای دارید، نود IF نیز میتواند انتخاب واضحتری باشد.
مثال کاربردی: محاسبه تخفیف محصولات
فرض کنید یک فروشگاه اینترنتی دارید و میخواهید برای محصولاتی که قیمت آنها بیشتر از پنج میلیون تومان است، تخفیف ۱۰ درصدی در نظر بگیرید.
داده ورودی:
{
"product_name": "Monitor",
"price": 6000000
}
در حالت Run Once for Each Item، کد زیر را بنویسید:
const price = Number($json.price);
if (!Number.isFinite(price) || price < 0) {
throw new Error("قیمت محصول معتبر نیست.");
}
const discountRate = price > 5000000 ? 0.10 : 0;
const discount = price * discountRate;
const finalPrice = price - discount;
return {
json: {
...$json,
discount,
final_price: finalPrice
}
};
در این کد، ابتدا قیمت اعتبارسنجی میشود. سپس با استفاده از شرط، مشخص میکنیم که محصول مشمول تخفیف است یا خیر.
اگر قیمت شش میلیون تومان باشد، تخفیف برابر ۶۰۰ هزار تومان خواهد بود و قیمت نهایی به ۵ میلیون و ۴۰۰ هزار تومان میرسد.
این مثال نشان میدهد چگونه میتوان از متغیرها، شرطها و محاسبات در یک Code Node استفاده کرد.
در یک سیستم فروشگاهی واقعی، باید واحد پول را نیز مشخص نگه دارید؛ بهخصوص اگر دادههای سیستمهای مختلف با تومان و ریال کار میکنند.
چگونه ساختار JSON را در Code Node تغییر دهیم؟
گاهی اطلاعات دریافتی از یک API با ساختاری که سیستم مقصد انتظار دارد متفاوت است.
برای مثال، API ممکن است داده زیر را برگرداند:
{
"first_name": "Ali",
"last_name": "Ahmadi",
"mobile_number": "09120000000"
}
اما سیستم مقصد به فیلدهای full_name و phone نیاز داشته باشد.
در حالت Run Once for Each Item میتوانیم بنویسیم:
const fullName = `${$json.first_name} ${$json.last_name}`;
return {
json: {
full_name: fullName,
phone: $json.mobile_number
}
};
خروجی:
{
"full_name": "Ali Ahmadi",
"phone": "09120000000"
}
در این مثال، ساختار داده را از قالب اول به قالب دوم تبدیل کردهایم.
اگر میخواهید فیلدهای قبلی را نیز نگه دارید، از ...$json استفاده کنید. در غیر این صورت، میتوانید فقط فیلدهای موردنیاز را در خروجی قرار دهید.
استفاده از Code Node همراه با HTTP Request
یکی از کاربردهای رایج Code Node، آمادهسازی دادهها برای ارسال به API است.
فرض کنید اطلاعات محصولات را دریافت کردهاید و باید برای هر محصول یک ساختار مشخص ایجاد کنید.
در Code Node میتوانید داده را به شکل موردنیاز آماده کنید و سپس آن را به HTTP Request بدهید.
برای مثال، در حالت Run Once for Each Item:
return {
json: {
sku: String($json.product_id),
title: $json.product_name,
price: Number($json.price),
available: Number($json.stock) > 0
}
};
این کد فیلدهای محصول را به قالب موردنیاز تبدیل میکند.
سپس در HTTP Request میتوانید از داده خروجی برای ساخت Body درخواست استفاده کنید؛ برای مثال با Expressionهای n8n.
البته ساختار نهایی باید با مستندات API مقصد مطابقت داشته باشد. Code Node بهتنهایی تضمین نمیکند که داده ارسالی از نظر سرویس مقصد معتبر است.
تفاوت Code Node و Edit Fields چیست؟
Edit Fields برای اضافهکردن، تغییر یا حذف فیلدهای داده مناسب است و بسیاری از تغییرات ساده را بدون نوشتن کد انجام میدهد.
Code Node زمانی مفیدتر است که منطق پردازش به برنامهنویسی نیاز داشته باشد.
| ویژگی | Edit Fields | Code Node |
|---|---|---|
| اضافه یا تغییر فیلد | مناسب | امکانپذیر |
| محاسبات ساده | با Expression قابل انجام است | امکانپذیر |
| شرطها و الگوریتمهای پیچیده | محدودتر | انعطافپذیرتر |
| پردازش آرایهها و مجموعه دادهها | وابسته به امکانات نود | با JavaScript قابل انجام |
| نیاز به دانش برنامهنویسی | کمتر | بیشتر |
| خوانایی برای افراد مبتدی | معمولاً سادهتر | به کیفیت کد بستگی دارد |
پیشنهاد میشود تا حد امکان از سادهترین ابزار مناسب استفاده کنید. اگر یک تغییر با Edit Fields بهراحتی انجام میشود، لزومی ندارد برای آن کد بنویسید.
تفاوت Code Node و Function در n8n
اگر آموزشهای قدیمی n8n را مطالعه کرده باشید، ممکن است با نام Function یا Function Item مواجه شده باشید.
این نودها در نسخههای قدیمیتر برای اجرای کد JavaScript استفاده میشدند. در نسخههای جدید، Code Node جایگزین رایج آنها شده است.
با این حال، هنگام انتقال Workflowهای قدیمی به نسخههای جدید، نباید فرض کنید که فقط تغییر نام نود کافی است. حالت اجرا، ساختار ورودی و خروجی و نحوه دسترسی به دادهها را نیز بررسی کنید.
در کلاستر آموزشی سایت، مقاله Function میتواند بهصورت جداگانه به مفهوم نودهای قدیمی، تفاوت آنها با Code Node و نکات مهاجرت بپردازد.
خطاهای رایج در Code Node و روش رفع آنها
خطای اول: خروجی با ساختار مورد انتظار مطابقت ندارد
یکی از اشتباهات رایج، برگرداندن داده با ساختاری است که با حالت اجرای انتخابشده سازگار نیست.
در حالت Run Once for Each Item، معمولاً یک آیتم خروجی برمیگردانید:
return {
json: {
result: "success"
}
};
در حالت Run Once for All Items، معمولاً باید آرایهای از آیتمها برگردانید:
return [
{
json: {
result: "success"
}
}
];
اگر ساختار خروجی با حالت اجرای نود سازگار نباشد، ممکن است با خطا مواجه شوید.
خطای دوم: مقدار $json تعریف نشده یا داده مورد انتظار وجود ندارد
ممکن است کد شما انتظار داشته باشد فیلد price وجود داشته باشد، اما نود قبلی آن را ارسال نکرده باشد.
برای رفع مشکل، خروجی نود قبلی را بررسی کنید و مطمئن شوید نام فیلد و ساختار داده درست است.
برای بررسی امنتر یک مقدار میتوانید بنویسید:
const price = Number($json.price);
if (!Number.isFinite(price)) {
throw new Error("مقدار price معتبر نیست.");
}
این روش به شما کمک میکند خطاهای مربوط به داده نامعتبر را واضحتر تشخیص دهید.
خطای سوم: جمع اعداد بهدرستی انجام نمیشود
گاهی مقادیر عددی از API بهصورت رشته دریافت میشوند.
برای مثال، اگر مقدار قیمت "1000" باشد، باید پیش از انجام محاسبات آن را به عدد تبدیل کنید.
const price = Number($json.price);
در محاسبات مهم، صرفاً تبدیل نوع کافی نیست؛ باید بررسی کنید مقدار نهایی عدد معتبر باشد.
خطای چهارم: کد برای مجموعهای از آیتمها فقط یک نتیجه میدهد
این مشکل ممکن است به حالت اجرای Code Node یا نحوه دسترسی به ورودی مربوط باشد.
اگر میخواهید تمام آیتمها را پردازش کنید، بررسی کنید حالت مناسب انتخاب شده باشد و در صورت استفاده از Run Once for All Items، از $input.all() استفاده کنید.
همچنین مطمئن شوید کد خروجی مورد انتظار را برای تمام آیتمها تولید میکند.
خطای پنجم: نمیتوانید یک کتابخانه JavaScript را وارد کنید
Code Node برای اجرای کد JavaScript طراحی شده است، اما دسترسی به کتابخانههای خارجی به محیط اجرا و تنظیمات n8n بستگی دارد.
نمیتوانید فرض کنید هر بستهای که در یک پروژه Node.js نصب شده است، بهطور خودکار در Code Node قابل استفاده است.
اگر به کتابخانه خارجی نیاز دارید، مستندات نسخه n8n و تنظیمات مجاز محیط اجرای خود را بررسی کنید. در محیطهای میزبانیشده نیز ممکن است محدودیتهای بیشتری وجود داشته باشد.
نکات امنیتی هنگام استفاده از Code Node
Code Node میتواند منطق سفارشی اجرا کند؛ بنابراین باید در انتخاب کد و دادههای ورودی دقت کنید.
- کد را قبل از اجرا بررسی کنید، بهخصوص اگر از منبع ناشناس دریافت شده است.
- اطلاعات حساس مانند رمز عبور، توکن API و کلیدهای خصوصی را بیدلیل در خروجی قرار ندهید.
- از اجرای کدهایی که به دادههای غیرقابلاعتماد وابستهاند بدون اعتبارسنجی خودداری کنید.
- برای دسترسی به APIها، از Credentials و سازوکارهای مناسب n8n استفاده کنید.
- در صورت نیاز به کتابخانههای خارجی، محدودیتهای محیط اجرا را بررسی کنید.
- کد را ابتدا با دادههای آزمایشی اجرا کنید و سپس به Workflow اصلی متصل کنید.
همچنین Code Node را با محیطی که دسترسی نامحدود به سیستمعامل دارد یکسان در نظر نگیرید. قابلیتها و محدودیتهای واقعی به نسخه n8n و نحوه استقرار آن وابسته است.
پرسشهای متداول درباره Code Node در n8n
Code Node در n8n چه کاربردی دارد؟
Code Node برای اجرای JavaScript و پیادهسازی منطق سفارشی در Workflow استفاده میشود؛ از جمله محاسبات، تغییر ساختار دادهها، فیلترکردن آیتمها و پردازش مجموعهای از اطلاعات.
آیا برای استفاده از Code Node باید JavaScript بلد باشم؟
آشنایی مقدماتی با JavaScript بسیار مفید است. با یادگیری متغیرها، شرطها، آرایهها، اشیاء و ساختار ورودی و خروجی n8n میتوانید بسیاری از کاربردهای این نود را پیادهسازی کنید.
تفاوت Run Once for Each Item و Run Once for All Items چیست؟
در حالت اول، کد برای هر آیتم جداگانه اجرا میشود. در حالت دوم، کد یک بار اجرا میشود و میتواند تمام آیتمهای ورودی را با استفاده از $input.all() پردازش کند.
چگونه به اطلاعات ورودی در Code Node دسترسی پیدا کنیم؟
در حالت Run Once for Each Item میتوانید از $json برای دسترسی به داده آیتم جاری استفاده کنید. در حالت Run Once for All Items، روش رایج دریافت مجموعه ورودی استفاده از $input.all() است.
آیا میتوان با Code Node به API درخواست ارسال کرد؟
برای درخواست HTTP معمولاً بهتر است از نود HTTP Request استفاده کنید. Code Node میتواند دادهها را پیش از ارسال آماده کند یا پاسخ دریافتشده را پردازش کند.
آیا Code Node جایگزین Edit Fields است؟
خیر. Edit Fields برای تغییرات ساده داده مناسب است و Code Node برای پردازشهای برنامهنویسیشده انعطاف بیشتری دارد. انتخاب ابزار مناسب به پیچیدگی عملیات بستگی دارد.
چرا کد من در Code Node خطا میدهد؟
دلایل رایج شامل دسترسی اشتباه به فیلدها، ناسازگاری ساختار خروجی با حالت اجرا، دادههای نامعتبر و استفاده از کتابخانههای غیرمجاز در محیط اجراست. بررسی ورودی، خروجی و جزئیات خطای نود معمولاً نقطه شروع مناسبی است.
جمعبندی
Code Node در n8n ابزاری قدرتمند برای توسعه Workflowهایی است که به منطق اختصاصی نیاز دارند. با کمک JavaScript میتوانید دادهها را محاسبه کنید، فیلدها را تغییر دهید، آیتمها را فیلتر کنید و اطلاعات را برای ارسال به API آماده سازید.
برای استفاده صحیح از این نود، تفاوت حالتهای Run Once for Each Item و Run Once for All Items را بشناسید، ساختار ورودی و خروجی را بررسی کنید و دادهها را پیش از انجام محاسبات اعتبارسنجی کنید.
در عین حال، همیشه لازم نیست برای هر تغییر از کد استفاده کنید. ترکیب درست نودهایی مانند Edit Fields، IF، Merge و Code میتواند Workflow شما را هم قدرتمند و هم قابلنگهداری نگه دارد.
در مقاله بعدی از این خوشه محتوایی، به سراغ Function در n8n میرویم و تفاوت آن با Code Node و نحوه مواجهه با Workflowهای قدیمیتر را بررسی میکنیم.





