وبسایت شخصی حسن هاشمی

برنامه نویس. ایران. قم :))

شروع کار با nodejs

یه چند روزی هست که بالاخره تصمیم گرفتم بشینم nodejs رو یاد بگیرم.

ازونطرف چون وب رو همیشه با asp.net کار کردم همش توی ذهنم مقایسه می کنم این دوتا رو :))

میخوام توی یه سری پست کوتاه همینجوری که خودم یاد میگیرم برای شما هم بذارم تا سود دو طرفه باشه تا بعدا در صورت نیازخودمم بهش ارجاع کنم.

بذارید شروع کنیم.

اول از همه یه چیزی که تو لحظه اول تمام تصوراتم از node رو تغییر داد، تعریفش بود. اگه توی نت سرچ کیند what is nodejs اولین نتیجه این متن رو میاره:
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast and scalable network applications.

یه لحظه صبر کنید: "یک پلتفرم برای اجرای جاوا اسکریپت" ! یعنی nodejs یک بستر برای اجرای javascript هست و بخش اصلیش با ++C نوشته شده.

یعنی اگه بخوام بهتر مثال بزنم، یه چیزی توی مایه های unity هست. (اگه سی شارپ یا ++C) کار کردین دیگه حتماً تا حالا یه دستی به یونیتی زدین.

توی یونیتی هم خود بازی رو کد سی شارپ شما کنترل می کنه اما تمامی محاسبات و عملیات های گرافیکی توی کد native انجام میشه.

یعنی پلتفرم node js که با سی پلاس پلاس هست، کد جاوا اسکریپت شما رو از طریق v8 روی سرور اجرا می کنه.

این یه نکته ای می رسونه و اون هم اینه که از اونجایی که جاوا اسکریپت کلا single thread هست وب سرور nodejs هم برخلاف asp.net که به ازای هر درخواست یه ترد از pool برای اون rqeuest اختصاص میده باید تمام request ها رو باید یه ترد Service دهی کنه. (توی پست "مباحثی در مورد thread ها در asp.net" در این مورد صحبت کردم قبلا.)

نتیجه همه این فلسفه بافی ها اینه که nodejs شما رو فورس می کنه کدتون async  باشه. به عبارت دیگه تمام درخواست ها توسط یه ترد دریافت میشن و هر موقع که شما خواستید عملیات io انجام بدین، پلتفرم node خودش به زور اون رو به صورت async براتون انجام میده. :))

من پارسال که یه سری به noodejs ناخونک زدم خیلی با این مورد حال کردم، بعد که رفتم یه کوچولو کد نوشتم دیدم call back هاش خیلی کثیف کاری بار میاره به عنوان مثال

readFromSocketAsync(function(data) { 

          letWriteToDb(data, successCallBack());

});  


در حالی که توی سی شارپ داریم:

await socket.ReadAsync(buffer, 0, buffer.Length);

await WroteToDb(buffer);


همین یه مورد هم حالم رو گرفت، اما الان که دارم این پست رو مینویسم داستان خیلی فرق کرده، es6 دقیقا امکان async / await سی شارپ رو کپی کرده توی جاوا اسکریپت  / typescript در نتیجه کدی که برای سی شارپ نوشتیم تا حد 90% برای جاوا اسکریتپت هم کار می کنه.

با توجه به معماری single-thread که توی nodjs هست میشه انتظار داشت که برای عملیات های nodejs سرعت بالایی داشته باشه ولی برای عملیات های محاسباتی نسبت به asp.net ضعیف تر عمل کنه. به نظر من که این مورد کلا اوکی هست چون 90% کاری که برای برنامه های وب فعلی روی سرور انجام میشه عملیات های io هست و تنها قسمت cpu ی، همون رندر html هست که اونم کم کم داره رنگ میبازه با فریمورک های SPA جدید.

جمع بندی این بخش اینه که انتظار scale-out کردن برنامه توی node.js خیلی راحت تر باشه


کار با دیتا

یه مورد دیگه ای که توی همون یه ساعت اول خیلی بهم حال داد راحتی کار با دیتابیس های document-base بود، خب همونطور که میدونید دیتابیس های nosql که document-based هستن رو الان نمیشه توی پروژه ها بی خیال شد.و غالب این دیتابیس ها هم دیتا رو به صورت json ذخیره می کنن و این هم دردسر رو توی سی شارپ میسازه بخاطر اینکه json یه ساختاری هست که ذاتا schema نداره و شعار #C هم داشتن schema هست. البته این داشتن schema توی خیلی از موارد کاملا اوکی هست ولی مشکل اینه که برنامه هایی که ما می نویسیم مخصوصا توی فاز توسعه خیلی زود schema هاشون تغییر می کنه (شاید هر روز حتی! ) و این map کردن اشیا بین سی شارپ و دیتابیس (document) یه دردسر همیشگی هست.

اگه mongo یا elastic استفاده کرده باشین الان دقیق میدونید که منظورم چیه، برای یه insert ساده باید چندین متد generic تو در تو رو فراخوانی کنید تا به درایورش بفهمونید که ساختارتون چی هست.

در مورد nodejs این موضوع صدق نمی کنه، چون اولا schema نداره و دوما json بخشی از خودشه!! نه یه غالب Serialize شده.


وخیلی واضح هست که هر درایوری برای دیتابیسی برای node.js هم وجود داره. یه نکته عجیب غریبش اینه که برای sql server یه درایور سی شارپ هست ولی در مقابلش برای node js اندازه موهای سر :)) که البته شاید چیز خوبی هم نباشه چون هر گلابی از راه رسیده یه درایور نوشته براش (از طرف دیگه  نشاط برنامه نویسای این اکوسیستم رو نشون :)) ).


IDE / Test: 

تو این مورد که اصلا حرفش رو هم نزنیم بهتره چون IDE هایی node js اصلا به هیچ وجه در مبحث تست و دیباگ و توسعه نزدیک IDE سی شارپ هم نیستن.

Loading