تاریخ انتشار: سه شنبه, ۳۰ ارديبهشت ۱۳۹۹، ۰۸:۴۲ ق.ظ نویسنده: محمدیان

 

تصور کنید یک فایل داریم با نام data.json و محتوای درون آن شامل یک آرایه از آبجکت های json است.

هدف ما اینه که میخواهیم علاوه بر اینکه این فایل رو میخونیم و اطلاعاتش رو درون یک متغیر ذخیره میکنیم. یک عضو دیگه هم به آرایه اضافه کنیم و آرایه جدید رو درون فایل data.json بنویسیم.

 

const fs = require('fs');

let data = fs.readFileSync('data.json');
data = JSON.parse(data);
data.push({myName:"Mokhtar"});
fs.writeFileSync('data.json',JSON.stringify(data));
console.log(data);

تصور کنید فایل data.json وجود نداشته باشد و ما برنامه رو اجرا کردیم. برنامه کرش میکنه و خطا میده. در صفحه مرجعی که برای جاواسکریپت تهیه کردم، ساختار try , catch , finally توضیح داده شده که الان به دردمون میخوره و میتونیم کاری کنیم که برنامه به کار خودش ادامه بده و خطا رو در کنسول چاپ کنه.

try{
    let data = fs.readFileSync('data.json');
    data = JSON.parse(data);
    data.push({myName:"Mokhtar"});
    fs.writeFileSync('data.json',JSON.stringify(data));
    console.log(data)
    }catch(err){
    console.log(err)
    }
console.log('program working whitout any crash 1.');
console.log('program working whitout any crash 2.');
console.log('program working whitout any crash 3.');
console.log('program working whitout any crash 4.');
console.log('program working whitout any crash 5.');

فایل data.json رو تغییر نام بدید و برنامه رو اجرا کنید. تمام پیام ها انتهای کدمون لاگ میشن که یعنی برنامه متوقف نشده و داره به کارش تا خط آخر ادامه میده.

تاریخ انتشار: سه شنبه, ۳۰ ارديبهشت ۱۳۹۹، ۰۷:۴۸ ق.ظ نویسنده: محمدیان

تفاوت همزمان و ناهمزمان

فرق اساسی Async با Sync در زمان اجرای دستورات است. در Sync یک درخواست بلافاصله اجرا می شود و بقیه سیستم باید منتظر پایان آن بماند. اما در Async درخواست به سیستم ارسال میشود و سیستم عامل قول میدهد که پایان آن را  اعلام کند اما اینکه دقیقا کی انجام میشود معلوم نیست.

استفاده از Async به معنی سریعتر شدن اجرای برنامه نیست. تضمینی وجود ندارد که متدهای Async به صورت موازی در Thread مجزا اجرا شوند.تصمیم گیری آن به عهده ی سیستم است. در واقع Async با برنامه نویسی موازی فرق دارد. در برنامه نویسی موازی سیستم عامل را مجبور می کنید از چند Thread جداگانه برای اجرای عملیات استفاده کند اما در Async این انتخاب به عهده ی سیستم عامل است.

از آنجا که زمان پایان در Async مشخص نیست Thread بعد از ارسال Task به سیستم عامل آزاد میشود و می تواند Request جدیدی را دریافت کند. می توان گفت در حالت Sync منابع سیستم بعد از پایان یک Request آزاد میشود اما در Async بعد از شروع  Request آزاد میشود. با این روش صف زودتر پیش میرود و احتمال اینکه درخواستی به علت زمان طولانی شدن زمان انتظار برگشت بخورد کمتر می شود.

در Async کار آهسته و پیوسته پیش میرود و همیشه حرکت رو به جلو وجود دارد. اما در Sync پیشرفت مقطعی است. وقتی ترافیک سرور بالا می رود عدم پیشرفت به خطای Server Time Out منجر میشود. در سرور Sync این حالت تا چند برابر (به صورت توانی) زودتر پیش می آید.

نتیجه

در وب توصیه میشود از متدهای Async استفاده کنید. معمولا پیاده سازی متدهای Async پیچیده تر است و کد نویسی آن زمان بیشتری می برد. اما در این روش منابع سرور به سرعت آزاد میشود و می تواند به Request های بیشتری پاسخ دهد. مخصوصا زمانی که با فایل یا دیتابیس کار می کنید.

 

منبع : کدهک

تاریخ انتشار: دوشنبه, ۲۲ ارديبهشت ۱۳۹۹، ۰۹:۴۱ ق.ظ نویسنده: محمدیان

چطور میتوانیم از دستورات خط فرمان آرگومان دریافت کنیم؟ اگر دستور زیر را اجرا کنیم چه اتفاقی می افتد؟

node app.js print

با اجرای این دستور، فایل شما اجرا میشود و هیچ اتفاق دیگری نمیفتد، اما شما میتوانید کلمه print را به صورت آرگومان دریافت کنید و تصمیم بگیرید که مثلا اگر کاربر این دستور را وارد کرد چه اتفاقی بیفتد.

چطور به آرگومان های دستور دسترسی پیدا کنیم؟ به صورت زیر:

process.argv
console.log(process.argv)

ابتدا این دستور را بررسی کنید تا ببینید که argv یک آرایه است و عضو اول آن آدرس فایل اجرایی nodejs در سیستم عامل را برمیگرداند و عضو دوم آن آدرس فایل اجرایی برنامه شما را در خود نگه میدارد. عضو سوم به بعد از کاربر قابل دریافت است. مثلا در اولین مثال: کلمه print عضو سوم آرایه argv میشود. میتوانید دستور زیر را در فایل app.js قرار دهید و این مورد را امتحان کنید.

console.log(process.argv[2])

و حالا دستور زیر را در cmd وارد کنید:

node app.js print

مورد زیر را هم با مواردی که تا کنون آموختید بررسی کنید.

node app.js print --title="your name for example"

میتوانید از آرایه argv، یک لاگ بگیرید و نتایج را مشاهده کنید.

 

حالا که موارد فوق رو متوجه شدید، یه ماژول حرفه ای بهتون معرفی میکنم که خیلی راحت تر با آرگومان ها کار کنید. ماژول yargs رو به صورت زیر در پروژه خودتون قرار بدید و اون رو فراخوانی کنید.

npm install yargs --save
const yargs = require('yargs');
بررسی کنید
console.log(yargs);
console.log(yargs.argv);

و حالا دوباره دستور زیر رو بررسی کنید

node app.js print --title="your name for example"

متوجه تفاوت ها شدید؟ 

yargs به ما آبجکت تحویل میده، آرایه دستورات ارسال شده از خط فرمان با _ در آبجکت yargs در دسترس خواهد بود مثلا:

let firstCommand = yargs._[0];
console.log(firstCommand);
  نتیجه در مثال ما => print

نکته : اگر دستور به صورت زیر وارد شود، yargs چه واکنشی به آن نشان میدهد؟

node app.js print --title "mokhtar"
علامت = وارد نشده

yargs تشخیص میدهد که print یک دستور است و title به عنوان یک ورودی متغیر ارسال شده.

 

با همین اطلاعات میتوانیم برنامه های قابل اجرا با command line بنویسیم. فقط کافیست لیست دستورات مورد نظر خودمان را تعریف کنیم و اگر کاربر دستورات مورد نظر ما را وارد کرد، عملیات خاصی را اجرا کنیم و اگر مثلا داده ای وارد نشده بود یا نوع داده وارد شده با داده مورد نظر ما تناسب نداشت، یک پیغام خطا برای کاربر ارسال کنیم.

 

پکیج yargs محدود به توابع فوق نمی شود و کتابخانه ای غنی است . با مراجعه به مستندات آن میتوانید اطلاعات مفیدی بدست بیاورید. یکی از توابع دیگر yargs تابع commands است که میتوانیم توسط آن یک دستور کامند لاین بسازیم.

yargs
  .command('get', 'make a get HTTP request', {
    url: {
      alias: 'u',
      default: 'http://yargs.js.org/'
    }
  })
  .help()
  .argv

اگر در کنسول دستور زیر را تایپ کنیم:

node index.js --help

//---------------- نتیجه ------------------
index.js [command]

Commands:
  index.js get  make a get HTTP request

Options:
  --version  Show version number                                       [boolean]
  --help     Show help                                                 [boolean]

برای آرگومانهایی هم که میخوایم دریافت کنیم، خواص مختلفی وجود داره که باعث میشه بتونیم مثل فیلد باهاشون برخورد کنیم.مثلاً:

yargs
  .command('print', 'this is my test', {
    body:{
        describe:'i am descripttion of print bode',
        demand:true,
        alias:'p'
    }
  })
  .help()
  .argv

describe : توضیحات مربوط به فیلد body هست.

demand : آیا پر کردن این فیلد برای اجرای دستور الزامی است؟

alias : میتونیم یه مخفف هم برای دستورمون در نظر بگیریم در مثال ما مثلا print-- میتونه p-- هم باشه.

تاریخ انتشار: دوشنبه, ۲۲ ارديبهشت ۱۳۹۹، ۰۹:۰۶ ق.ظ نویسنده: محمدیان

در فایل جاوااسکریپت خود، متغیر سراسری module را با دستور 

console.log(module)

بررسی نمائید. اگر دقت کنیدمی بینید که با یک آبجکت روبرو هستید و این آبجکت دارای آبجکت دیگری با نام exports است.

حالا میتوانید دستورات زیر را به شرط آشنایی با آبجکت های جاوااسکریپت به راحتی درک کنید.

module.exports.name = "Mokhtar Mohammadiyan";
module.exports = {
name : "Mokhtar Mohammadiyan"
}
var name = function(){
    return "Mokhtar Mohammadian";
}

module.exports = {
    name
}

میتوانید مثال های بیشتری در ذهن خود بسازید، مخصوصاً با استفاده از کلاس های es5 و یا typescript و یا همان آبجت خالص js.

 

درک module.exports برای من سخت بود، واسه همین چیزی که خودم فهمیدم رو با شما به اشتراک میزارم.

درک module.exports : 

module.exports یا exports یک شی خاص است که به طور پیش فرض در هر پرونده JS در برنامه Node.js گنجانده شده است. module یک متغیر است که ماژول فعلی را نشان می دهد و exports آبجکتی است که به عنوان ماژول در معرض دید برنامه قرار می گیرد. بنابراین ، هر آنچه را که به وسیله module.exports صادر یا  export کنید، به عنوان یک ماژول توسط برنامه اصلی دیده خواهد شد. امیدوارم که متوجه شده باشید.

 

موفق و پیروز باشید