پیشنیاز جاوااسکریپت؛ آزمون آمادگی برای ورود به Node.js
در این درس ۶ بخش
برای شروع Node.js لازم نیست همهٔ روشهای آرایه یا تمام جزئیات زبان را حفظ باشید. باید بتوانید داده را به شکل شیء و آرایه مدل کنید، تابع کوچک بنویسید، مقدار برگشتی را دنبال کنید و خطا را از خروجی موفق تشخیص دهید. در برنامهٔ سمت سرور، داده از مرزهای بیرونی میآید و همیشه مطابق انتظار نیست؛ بنابراین شناخت نوع داده و رفتار کد هنگام شکست، از حفظکردن نام یک کتابخانه مهمتر است. این درس با سه آزمایش کوچک نشان میدهد کدام پیشنیازها را باید تقویت کنید.
آمادگی اول؛ تبدیل فهرست داده به نتیجه
مثال زیر را در فایل readiness.mjs قرار دهید. پس از نصب محیط، آن را مستقل اجرا کنید؛ پیش از اجرا، خروجی را روی کاغذ بنویسید. هدف فهم رابطهٔ آرایه، تابع و شیء است. برای خواندن این مثال باید const، مقایسهٔ دقیق، filter، map و دسترسی به ویژگی شیء را بشناسید. کپیکردن کد و دیدن خروجی، بدون توان توضیح ورودی و خروجی تابع، معیار کافی برای آمادگی نیست.
const tickets = [
{ id: 't1', title: 'نصب محیط', status: 'open' },
{ id: 't2', title: 'پرسش دربارهٔ فایل', status: 'closed' },
{ id: 't3', title: 'خطای اجرا', status: 'open' }
];
function openTitles(rows) {
return rows
.filter(row => row.status === 'open')
.map(row => row.title);
}
console.log(openTitles(tickets));
// ['نصب محیط', 'خطای اجرا']
console.log(tickets.length); // 3filter آرایهٔ تازهای از ردیفهای انتخابشده میسازد و map عنوان هرکدام را برمیگرداند. این دو عملیات تعداد ردیفهای آرایهٔ اصلی را کم نمیکنند. با این حال، شیءهای انتخابشده ممکن است هنوز با منبع مشترک باشند؛ این مثال فقط آنها را میخواند. اکنون همهٔ وضعیتها را closed کنید. نتیجه باید آرایهٔ خالی باشد، نه خطا یا متن «موجود نیست». تصمیم دربارهٔ پیام مناسب، مربوط به لایهٔ نمایش خواهد بود.
آمادگی دوم؛ نوع و قرارداد ورودی
تابع زیر فقط عنوان متنی با طول مشخص را میپذیرد. عبارت trim فاصلهٔ ابتدا و انتها را حذف میکند؛ بنابراین بررسی نوع باید پیش از فراخوانی آن انجام شود. کار برنامهنویس سرور این نیست که هر ورودی را به هر قیمتی تبدیل به مقدار قابل قبول کند. گاهی رد صریح داده، از ثبت نتیجهٔ ظاهراً موفق ولی نادرست بهتر است. این مثال را به انتهای همان فایل اضافه کنید.
function normalizeTitle(input) {
if (typeof input !== 'string') {
throw new TypeError('Title must be text');
}
const title = input.trim();
if (title.length < 3 || title.length > 80) {
throw new RangeError('Title length must be 3..80');
}
return title;
}
console.log(normalizeTitle(' نصب محیط ')); // نصب محیط
try {
normalizeTitle(null);
} catch (error) {
console.log(error.name); // TypeError
}اگر بررسی typeof را حذف کنید، null هنگام trim خطا میدهد؛ اما آن خطا قرارداد مورد نظر شما را توضیح نمیدهد. try و catch مسیر موفق را از مسیر شکست جدا میکنند. در یک API واقعی، متن داخلی خطا الزاماً همان چیزی نیست که به کاربر برمیگردانیم. جزئیات مسیر فایل یا پشتهٔ اجرای سرور را نباید بیدلیل در پاسخ عمومی قرار داد. در این مرحله فقط میخواهیم شکست را آگاهانه ببینیم و آن را خاموش نکنیم.
آمادگی سوم؛ Promise، async و await
async function loadSample(shouldFail = false) {
if (shouldFail) throw new Error('Sample unavailable');
return [{ id: 't1', title: 'نصب محیط', status: 'open' }];
}
console.log('A');
try {
const rows = await loadSample();
console.log(rows.length); // 1
await loadSample(true);
} catch (error) {
console.log(error.message); // Sample unavailable
}
console.log('B');فایل با پسوند mjs اجازه میدهد در سطح بالای ماژول از await استفاده کنیم. تابع async یک Promise برمیگرداند و throw درون آن، به ردشدن آن Promise منجر میشود. await نتیجه را در همین مسیر دریافت میکند و خطا را به catch میرساند. خروجی مثال به ترتیب A، عدد 1، پیام شکست و B است. این نمونه هیچ درخواست شبکهای ندارد؛ عمداً دادهٔ محلی را به کار بردهایم تا رفتار زبان را مستقل از اینترنت بررسی کنیم. await به معنی متوقفشدن همهٔ درخواستهای سرور نیست.
اگر در آزمون متوقف شدید، مسیر جبران چیست؟
اگر تابع، شرط و آرایه برایتان تازه است، دورهٔ پایه را از بخش مربوط تکمیل کنید: https://www.darsavand.com/courses/javascript-from-zero-to-project
اگر با نحو آشنایید ولی دربارهٔ مرجع شیء، ماژول، Promise یا اعتبار داده تردید دارید، درسهای مرتبط دورهٔ دوم را بخوانید: https://www.darsavand.com/courses/javascript-project-lab
لازم نیست صرفاً برای فراموشکردن یک نام روش، همهٔ دوره را دوباره شروع کنید؛ یک ضعف مشخص را پیدا کنید و همان را با تمرین برطرف کنید.
خواندن HTML مقدماتی برای شناخت فرم و مرورگر مفید است، اما پروژهٔ API را میتوان پیش از ساخت رابط گرافیکی با یک کلاینت درخواست آزمایش کرد. آشنایی با پوشه و فایل و امکان نوشتن نام فایل واقعی نیز لازم است. SQL، Docker، TypeScript و چارچوبهای وب، پیشنیاز اجباری این دوره نیستند. آنها در مسیرهای بعدی با مسئلهٔ مناسب معنا پیدا میکنند. نصب ابزارهای بیشتر، ضعف در مدل داده یا مدیریت خطا را جبران نمیکند.
تمرین با پاسخ و معیار عبور
تابع openIds را بنویسید که شناسهٔ تیکتهای باز را برگرداند و سپس loadSample(true) را در یک try و catch مستقل اجرا کنید. پاسخ اول: همان زنجیرهٔ filter را حفظ و در map بهجای row.title، مقدار row.id را برگردانید؛ برای دادهٔ نخست درس، خروجی باید t1 و t3 باشد. پاسخ دوم: await را درون try قرار دهید و در catch فقط پیام آموزشی کنترلشده چاپ کنید. معیار عبور این است که نتیجهٔ آرایهٔ خالی، ورودی null و Promise ردشده را بتوانید پیشبینی کنید و توضیح دهید چرا هرکدام متفاوت است.
منابع رسمی برای ادامهٔ مطالعه
پیشنیازهای زبان برای Node.js: https://nodejs.org/learn/getting-started/how-much-javascript-do-you-need-to-know-to-use-nodejs
توابع ناهمگام: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
مدیریت خطا: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch
متن فارسی، سناریوها و مثالها: تألیف مستقل تحریریه درسآوند.
متن درسهای عمومی را بدون ورود بخوانید.