سوالات مصاحبه فنی Node js برای استخدام برنامه‌‌نویسان

Nodejs Interview Questions

nodejs-interview-questions

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

توجه کنید که مصاحبه های فنی از مصاحبه های عادی جدا هستند، چراکه مصاحبه های عادی معمولا برای شناخت بهتر شما و رزومه شما انجام می شوند در حالی که مصاحبه های فنی برای تست کردن مهارت شما طراحی شده اند.

این مقاله برای کسانی مفید است که آشنایی کامل با node js داشته باشند.

1- runtime در Node.js به چه معناست؟

زمان اجرا Node.js پشته نرم افزاری است که مسئول نصب کد وب سرویس و وابستگی های آن و اجرای سرویس شما است.

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

2- استفاده از NODE_ENV را توضیح دهید؟

NODE_ENV یک متغیر محیطی است که توسط چارچوب وب سرور اکسپرس محبوب شده است. هنگامی که یک برنامه نود اجرا می شود، می تواند مقدار متغیر محیطی را بررسی کند و بر اساس مقدار، کارهای مختلفی انجام دهد.

مثلا وقتی روی پروژه ای کار می کنیم و محیط های تولید و توسعه وجود دارد، ما نیازی به استفاده از کش در env توسعه نداریم. بنابراین تنظیم کرده ایم:

$ NODE_ENV=development

و از کد زیر استفاده می کنیم:

if (process.env.NODE_ENV === 'development')
    useCaching = false;

3- Node.js چگونه کار می کند؟

Node کاملاً رویدادمحور است. اساساً سرور از یک رشته تشکیل شده است که رویدادها را یکی پس از دیگری پردازش می کند.

درخواست جدیدی که وارد می شود، یک نوع رویداد است. سرور شروع به پردازش آن می کند و هنگامی که یک عملیات IO مسدود می شود، صبر نمی کند تا کامل شود و در عوض یک تابع تماس را ثبت می کند. سپس سرور بلافاصله شروع به پردازش یک رویداد دیگر (شاید درخواست دیگری) می کند. هنگامی که عملیات IO به پایان رسید، این نوع دیگری از رویداد است، و سرور آن را پردازش می کند (یعنی به کار بر روی درخواست ادامه می دهد) به محض اینکه زمان داشته باشد، با اجرای تماس برگشتی.

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

Node JS Platform از Request/Response Multi-threaded Modelless Stateless پیروی نمی کند. از Single Threaded با مدل حلقه رویداد پیروی می کند. مدل پردازش Node JS عمدتاً مبتنی بر مدل مبتنی بر رویداد جاوا اسکریپت با مکانیسم پاسخ به تماس جاوا اسکریپت است.

4- تفاوت Node.js، AJAX و JQuery چیست؟

Node.js یک زمان اجرا جاوا اسکریپت است که امکان نوشتن back-end برنامه ها را برای ما فراهم می کند.

جاوا اسکریپت ناهمزمان (Asynchronous) و XML (AJAX) به گروهی از فناوری‌ها اطلاق می‌شود که از آنها برای ارسال درخواست به سرورهای وب و بازیابی داده‌ها از آنها بدون بارگیری مجدد صفحه استفاده می‌کنیم.

Jquery یک کتابخانه جاوا اسکریپت ساده است که به ما در توسعه front-end کمک می کند.

5- ماژول های اصلی Node.js چیست؟

آنها در منبع Node.js تعریف شده اند و در پوشه lib/ قرار دارند و Node.js چندین ماژول دارد که در باینری کامپایل شده اند.

ماژول‌های هسته همیشه ترجیحاً بارگذاری می‌شوند اگر شناسه آن‌ها به () require ارسال شود. برای مثال، require('http') همیشه ماژول ساخته شده در HTTP را برمی گرداند، حتی اگر فایلی با آن نام وجود داشته باشد.

ماژول‌های هسته را می‌توان با استفاده از پیشوند node: شناسایی کرد، در این صورت حافظه نهان مورد نیاز را دور می‌زند. برای مثال، require('node:http') همیشه ماژول ساخته شده در HTTP را برمی گرداند، حتی اگر ورودی require.cache با آن نام وجود داشته باشد.

6- تابع callback در Node.js چیست؟

در node.js، ما اساساً از callbacks برای مدیریت عملیات ناهمزمان استفاده می‌کنیم، مانند ایجاد هرگونه درخواست ورودی/خروجی، عملیات پایگاه داده یا فراخوانی یک API برای واکشی برخی داده‌ها. Callback به کد ما اجازه می دهد تا زمانی که یک فرآیند طولانی طول می کشد مسدود نشود.

function myNew(next){
    console.log("Im the one who initates callback");
    next("nope", "success");
}

myNew(function(err, res){
    console.log("I got back from callback",err, res);
});

 7- assert چگونه در Node.js کار می کند؟

ماژول assert راهی برای آزمایش عبارات ارائه می دهد. اگر عبارت به 0 یا نادرست ارزیابی شود، یک ادعا ایجاد می شود و برنامه خاتمه می یابد.

این ماژول برای استفاده داخلی توسط Node.js ساخته شده است.

// Sample usage

const assert = require('assert');
assert(50 > 70, "50 is less than 70.");

8- تماس اول با خطا (error-first) چیست؟

الگوی مورد استفاده در تمام متدهای ناهمزمان در Node.js Error-first Callback نامیده می شود. به عنوان مثال:

fs.readFile( "file.json", function ( err, data ) {
  if ( err ) {
    console.error( err );
  }
  console.log( data );
});

هر روش ناهمزمان (asynchronous) انتظار دارد که یکی از آرگومان ها یک callback باشد. فهرست کامل آرگومان بازگشت به تماس به روش فراخواننده بستگی دارد، اما آرگومان اول همیشه یک شی خطا یا تهی است. وقتی به سراغ روش ناهمزمان می رویم، استثنایی که در طول اجرای تابع پرتاب می شود، در دستور try/catch قابل شناسایی نیست. این رویداد پس از خروج موتور جاوا اسکریپت از بلوک try رخ می دهد.

در مثال قبل، اگر در حین خواندن فایل استثنایی وجود داشته باشد، به عنوان پارامتر اول و اجباری روی تابع callback قرار می گیرد.

9- callback hell در Node.js چیست؟

Callback hell پدیده‌ای است که زمانی که توسعه‌دهنده جاوا اسکریپت می‌خواهد چندین عملیات ناهمزمان را یکی پس از دیگری اجرا کند، تحت تأثیر قرار می‌گیرد.

یک تابع ناهمزمان (asynchronous) تابعی است که در آن برخی از فعالیت های خارجی باید قبل از پردازش یک نتیجه انجام شود. "ناهمزمان" است به این معنا که مقدار زمان غیرقابل پیش بینی قبل از در دسترس شدن یک نتیجه وجود دارد. چنین توابعی برای رسیدگی به خطاها و پردازش نتیجه نیاز به یک تابع فراخوانی دارند.

getData(function(a){
    getMoreData(a, function(b){
        getMoreData(b, function(c){ 
            getMoreData(c, function(d){ 
                getMoreData(d, function(e){ 
                    ...
                });
            });
        });
    });
});

تکنیک هایی برای اجتناب از callback hell:

  1. Async.js
  2. Promises
  3. Async-Await

مدیریت تماس های برگشتی با استفاده از Async.js:

Async یک ماژول npm واقعا قدرتمند برای مدیریت ماهیت ناهمزمان جاوا اسکریپت است. همراه با Node.js، برای جاوا اسکریپت نوشته شده برای مرورگرها نیز کار می کند.

Async ابزارهای قدرتمند زیادی را برای کار با فرآیندهای ناهمزمان تحت سناریوهای مختلف ارائه می دهد.

npm install --save async

10- Promises در Node.js چیست؟

اجازه می دهد تا کنترل کننده ها را به ارزش موفقیت نهایی یا دلیل شکست یک اقدام ناهمزمان مرتبط کنیم. این به روش‌های ناهمزمان اجازه می‌دهد مانند روش‌های همزمان مقادیری را برگردانند: به جای مقدار نهایی، روش ناهمزمان وعده‌ای را برای مقدار در نقطه‌ای در آینده برمی‌گرداند.

Promises در node.js قول داده بود که برخی کارها را انجام دهد و سپس تماس‌های جداگانه‌ای داشت که برای موفقیت و شکست و همچنین رسیدگی به وقفه‌های زمانی اجرا می‌شد. راه دیگری برای فکر کردن به وعده‌ها در node.js این بود که آنها emitters بودند که می‌توانستند فقط دو رویداد را منتشر کنند: موفقیت و خطا. نکته جالب در مورد وعده‌ها این است که می‌توانید آنها را در زنجیره‌های وابستگی ترکیب کنید

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

pending - حالت اولیه یک وعده.
fulfilled  - حالت یک وعده که نشان دهنده یک عملیات موفقیت آمیز است.
rejected - حالت یک وعده که نشان دهنده یک عملیات ناموفق است. زمانی که یک وعده محقق شود یا رد شود، تغییر ناپذیر است (یعنی هرگز نمی تواند دوباره تغییر کند).

var myPromise = new Promise(function(resolve, reject){
   ....
})

11- از چه ابزارهایی می توان برای اطمینان از سبک ثابت (consistent style) استفاده کرد؟

  • ESLint
  • Standard

12- چه زمانی باید npm استفاده کرد و چه زمانی از yarn؟

  • npm

این روش پیش فرض برای مدیریت بسته ها در محیط اجرا Node.js است. این برنامه بر یک کلاینت خط فرمان و پایگاه داده ای متشکل از بسته های عمومی و پریمیوم به نام رجیستری npm متکی است. کاربران می توانند از طریق کلاینت به رجیستری دسترسی پیدا کنند و بسته های بسیاری را که از طریق وب سایت npm در دسترس است، مرور کنند. هم npm و هم رجیستری آن توسط npm، Inc مدیریت می شوند.

node -v
npm -v
  • Yarn

Yarn توسط فیس بوک در تلاش برای رفع برخی از کاستی های npm توسعه یافته است. yarn از نظر فنی جایگزینی برای npm نیست زیرا به ماژول های رجیستری npm متکی است. Yarn را به عنوان یک نصب کننده جدید در نظر بگیرید که همچنان بر همان ساختار npm متکی است. خود رجیستری تغییر نکرده است، اما روش نصب متفاوت است. از آنجایی که Yarn به شما امکان دسترسی به بسته‌های مشابه npm را می‌دهد، انتقال از npm به Yarn نیازی به ایجاد تغییر در گردش کار خود ندارد.

npm install yarn --global

مقایسه yarn در مقابل npm

Yarn سریع است: هر بسته ای را که دانلود می کند در حافظه پنهان ذخیره می کند تا دیگر نیازی به این کار نباشد. همچنین عملیات را موازی می کند تا استفاده از منابع را به حداکثر برساند، بنابراین زمان نصب سریعتر از همیشه است.

Yarn قابل اعتماد است: با استفاده از یک فرمت فایل قفل دقیق، اما مختصر و یک الگوریتم قطعی برای نصب، می‌تواند تضمین کند که نصبی که روی یک سیستم کار می‌کند دقیقاً به همان روش روی هر سیستم دیگری کار می‌کند.

Yarn امن: از چک‌سام‌ها برای تأیید صحت هر بسته نصب شده قبل از اجرای کد آن استفاده می‌کند.

حالت آفلاین: اگر قبلاً بسته‌ای را نصب کرده‌اید، می‌توانید آن را دوباره بدون اتصال به اینترنت نصب کنید.

قطعی: وابستگی‌های یکسانی بدون در نظر گرفتن ترتیب نصب، دقیقاً به همان روش در همه ماشین‌ها نصب می‌شوند.

Yarn در عملکرد شبکه: به طور موثر درخواست ها را در صف قرار می دهد و از آبشارهای درخواستی جلوگیری می کند تا استفاده از شبکه را به حداکثر برساند.

ثبت چندگانه: هر بسته ای را از npm یا Bower نصب کنید و گردش کار بسته خود را یکسان نگه دارید.

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

حالت مسطح: نسخه‌های ناهماهنگ وابستگی‌ها را با یک نسخه حل کنید تا از ایجاد موارد تکراری جلوگیری کنید.

13- هرم آزمایشی چیست؟ چگونه می توانید آن را هنگام صحبت در مورد API های HTTP پیاده سازی کنید؟

"هرم تست" استعاره ای است که به ما می گوید تست های نرم افزار را در سطل هایی با دانه بندی های مختلف گروه بندی کنیم. همچنین ایده ای از تعداد تست هایی که باید در هر یک از این گروه ها داشته باشیم به دست می دهد. این نشان می دهد که چه نوع تست هایی را باید در سطوح مختلف هرم جستجو کنید و مثال های عملی در مورد نحوه اجرای آنها ارائه می دهد.

هرم آزمایشی اصلی مایک کوهن شامل سه لایه است که مجموعه آزمایشی شما باید از پایین به بالا تشکیل شود:

  1. Unit Tests
  2. Service Tests
  3. User Interface Tests

14- چگونه می توانید کوکی های HTTP خود را در برابر حملات XSS ایمن کنید؟

1. هنگامی که وب سرور کوکی ها را تنظیم می کند، می تواند برخی از ویژگی های اضافی را ارائه دهد تا مطمئن شود که کوکی ها با استفاده از جاوا اسکریپت مخرب قابل دسترسی نیستند. یکی از این ویژگی ها HttpOnly است.

Set-Cookie: [name]=[value]; HttpOnly

HttpOnly اطمینان حاصل می کند که کوکی ها فقط به دامنه ای که از آن منشا گرفته اند ارسال می شود.

2. ویژگی "Secure" می تواند مطمئن شود که کوکی ها فقط از طریق کانال ایمن ارسال می شوند.

Set-Cookie: [name]=[value]; Secure

3. وب سرور می تواند از هدر پاسخ X-XSS-Protection استفاده کند تا مطمئن شود صفحات هنگام شناسایی حملات اسکریپت نویسی متقابل منعکس شده (XSS) بارگیری نمی شوند.

X-XSS-Protection: 1; mode=block

4. وب سرور می تواند از هدر پاسخ محتوای امنیت-خط مشی HTTP برای کنترل منابعی که یک عامل کاربر مجاز است برای یک صفحه خاص بارگذاری کند استفاده کند. این می تواند به جلوگیری از انواع حملات مانند Cross Site Scripting (XSS) و حملات تزریق داده کمک کند.

Content-Security-Policy: default-src 'self' *.http://sometrustedwebsite.com

15- چگونه می توانید مطمئن شوید که وابستگی (dependencies) های شما ایمن هستند؟

تنها گزینه این است که به‌روزرسانی / ممیزی امنیتی وابستگی‌های خود را خودکار کنید. برای آن گزینه های رایگان و پولی وجود دارد:

  1. npm outdated
  2. Trace by RisingStack
  3. NSP
  4. GreenKeeper
  5. Snyk
  6. npm audit
  7. npm audit fix

16- حلقه رویداد در Node.js چیست؟ چگونه کار می کند؟

حلقه رویداد چیزی است که به Node.js اجازه می‌دهد تا عملیات ورودی/خروجی غیرمسدود کننده را انجام دهد - علیرغم اینکه جاوا اسکریپت تک رشته‌ای است - با بارگذاری عملیات در هسته سیستم در صورت امکان.

Node.js یک برنامه تک رشته ای است، اما می تواند همزمانی را از طریق مفهوم رویداد و callbacks پشتیبانی کند. هر API Node.js ناهمزمان است و تک رشته ای است، آنها از فراخوانی تابع async برای حفظ همزمانی استفاده می کنند. گره از الگوی مشاهده گر استفاده می کند. Node Thread یک حلقه رویداد را نگه می دارد و هر زمان که یک کار تکمیل می شود، رویداد مربوطه را فعال می کند که به تابع رویداد شنونده سیگنال می دهد تا اجرا شود.

برنامه نویسی رویدادمحور (Event-Driven)

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

اگرچه رویدادها کاملاً شبیه به callback ها هستند، تفاوت در این واقعیت نهفته است که توابع برگشت تماس زمانی فراخوانی می شوند که یک تابع ناهمزمان نتیجه خود را برمی گرداند، در حالی که مدیریت رویداد بر روی الگوی مشاهدهگر کار می کند. عملکردهایی که به رویدادها گوش می دهند به عنوان ناظر عمل می کنند. هر زمان که یک رویداد فعال می شود، عملکرد شنونده آن شروع به اجرا می کند. Node.js دارای چندین رویداد داخلی است که از طریق ماژول رویدادها و کلاس EventEmitter در دسترس هستند که برای اتصال رویدادها و شنوندگان رویداد به شرح زیر استفاده می شوند.

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

مثال:

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// Create an event handler as follows
var connectHandler = function connected() {
   console.log('connection succesful.');
  
   // Fire the data_received event 
   eventEmitter.emit('data_received');
}

// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
 
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
   console.log('data received succesfully.');
});

// Fire the connection event 
eventEmitter.emit('connection');

console.log("Program Ended.");

17- REPL چیست؟ برای چه منظوری استفاده می شود؟

REPL (READ، EVAL، PRINT، LOOP) یک محیط کامپیوتری شبیه به Shell (یونیکس/لینوکس) و خط فرمان است. Node هنگام نصب با محیط REPL همراه است. سیستم از طریق خروجی دستورات/عبارات استفاده شده با کاربر تعامل دارد. در نوشتن و رفع اشکال کدها مفید است. کار REPL را می توان از شکل کامل آن فهمید:

Read: ورودی های کاربران را می خواند و آن را در ساختار داده جاوا اسکریپت تجزیه می کند. سپس در حافظه ذخیره می شود.
Eval: ساختار داده جاوا اسکریپت تجزیه شده برای نتایج ارزیابی می شود.
Print: نتیجه پس از ارزیابی چاپ می شود.
Loop: فرمان ورودی را حلقه می کند. برای خارج شدن از NODE REPL، ctrl+c را دوبار فشار دهید

مثال:

$ node
> 10 + 20
30
> 10 + ( 20 * 30 ) - 40
570
>

18- برنامه نویسی ناهمزمان در Node.js چیست؟

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

19- تفاوت بین Asynchronous و Non-Blocking چیست؟

Asynchronous

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

Non-Blocking

عدم انسداد بلافاصله با هر داده در دسترس پاسخ می دهد. علاوه بر این، هیچ اجرایی را مسدود نمی کند و طبق درخواست ها به کار خود ادامه می دهد. اگر پاسخی بازیابی نشد، در آن موارد API بلافاصله با یک خطا برمی‌گردد. عدم انسداد بیشتر با I/O (ورودی/خروجی) استفاده می شود. Node.js خود بر اساس مدل ورودی/خروجی غیربلاک است. راه های ارتباطی کمی وجود دارد که ورودی/خروجی غیرانسدادی آنها را تکمیل کرده باشد. پس از اتمام عملیات، تابع تماس مجدد فراخوانی می شود. تماس غیرانسدادی از کمک جاوا اسکریپت استفاده می کند که عملکرد برگشت به تماس را ارائه می دهد.

Asynchronous VS Non-Blocking

1. Asynchronous فوراً پاسخ نمی دهد، در حالی که Nonblocking در صورت موجود بودن داده بلافاصله پاسخ می دهد و در غیر این صورت به سادگی یک خطا را برمی گرداند.

2. ناهمزمان با انجام سریع کار، کارایی را بهبود می بخشد زیرا ممکن است پاسخ بعداً بیاید، در عین حال، می تواند کارهای دیگر را کامل کند. غیر مسدود کردن هیچ اجرایی را مسدود نمی کند و اگر داده در دسترس باشد، اطلاعات را به سرعت بازیابی می کند.

3. ناهمزمان برعکس همزمان است در حالی که ورودی/خروجی غیرمسدود مخالف مسدود کردن است. هر دوی آنها تقریباً مشابه هستند، اما همچنین متفاوت هستند، زیرا ناهمزمان با طیف وسیع تری از عملیات استفاده می شود، در حالی که غیر مسدود کردن بیشتر با I/O استفاده می شود.

20- چگونه یک برنامه را debug کنیم؟

node-inspector

npm install -g node-inspector

Run

node-debug app.js

Debugging

  • Debugger
  • Node Inspector
  • Visual Studio Code
  • Cloud9
  • Brackets

Profiling

1. node --prof ./app.js
2. node --prof-process ./the-generated-log-file

Heapdumps

node-heapdump with Chrome Developer Tools

Tracing

Interactive Stack Traces with TraceGL

Logging

  • Caterpillar
  • Tracer
  • scribbles

21- برخی از محبوب ترین بسته های Node.js کدامند؟

Async: یک ماژول ابزاری است که عملکردهای مستقیم و قدرتمندی را برای کار با جاوا اسکریپت ناهمزمان ارائه می دهد.

Browserify: به صورت بازگشتی همه فراخوانی های ()require را در برنامه شما تجزیه و تحلیل می کند تا بسته ای بسازد که می توانید در یک تگ <script> به مرورگر ارائه دهید.

Bower: یک مدیر بسته برای وب است. با واکشی و نصب بسته‌ها از همه جا، مراقبت از شکار، یافتن، دانلود و ذخیره موارد مورد نظر شما کار می‌کند.

Csv: ماژول csv دارای چهار ماژول فرعی است که تولید CSV، تجزیه، تبدیل و سریال سازی را برای Node.js فراهم می کند.

Debug: یک ابزار اشکال زدایی کوچک node.js است که از تکنیک اشکال زدایی هسته گره مدل شده است.

Express: یک چارچوب وب سریع، بدون نظر و مینیمالیستی است. این ابزار کوچک و قوی برای سرورهای HTTP فراهم می کند و آن را به یک راه حل عالی برای برنامه های کاربردی تک صفحه ای، وب سایت ها، ترکیبی ها یا API های عمومی HTTP تبدیل می کند.

Grunt: یک جاوا اسکریپت Task Runner است که ایجاد پروژه‌های جدید را تسهیل می‌کند و انجام کارهای تکراری اما ضروری مانند پر کردن، تست واحد، الحاق و کوچک‌سازی فایل‌ها (از جمله موارد دیگر) را بی‌اهمیت می‌کند.

Gulp: یک سیستم ساخت جریان است که به شما کمک می کند کارهای دردناک یا وقت گیر را در جریان کار توسعه خود به طور خودکار انجام دهید.

Hapi: یک سیستم ساخت جریان است که به شما کمک می کند کارهای دردناک یا وقت گیر را در گردش کار توسعه خود به طور خودکار انجام دهید.

Http-server: یک سرور http خط فرمان ساده و بدون پیکربندی است. این به اندازه کافی برای استفاده در تولید قدرتمند است، اما به اندازه کافی ساده و قابل هک است تا برای آزمایش، توسعه محلی و یادگیری از آن استفاده شود.

Inquirer: مجموعه ای از رابط های کاربری خط فرمان تعاملی رایج.

JQuery: jQuery یک کتابخانه جاوا اسکریپت سریع، کوچک و غنی است.

Jshint: ابزار تجزیه و تحلیل استاتیک برای تشخیص خطاها و مشکلات احتمالی در کد جاوا اسکریپت و اجرای قوانین کدنویسی تیم شما.

Koa: Koa چارچوب برنامه وب است. این یک میان افزار HTTP رسا برای node.js است تا برنامه های کاربردی وب و API ها را برای نوشتن لذت بخش تر کند.

Lodash: کتابخانه lodash به عنوان یک ماژول گره صادر می شود. Lodash یک کتابخانه ابزار مدرن جاوا اسکریپت است که ماژولار بودن، عملکرد و موارد اضافی را ارائه می دهد.

Less: کتابخانه کمتری به عنوان یک ماژول گره صادر می شود.

Moment: یک کتابخانه تاریخ جاوا اسکریپت سبک برای تجزیه، اعتبارسنجی، دستکاری و قالب‌بندی تاریخ‌ها.

Mongoose: این یک ابزار مدل‌سازی شی MongoDB است که برای کار در یک محیط ناهمزمان طراحی شده است.

MongoDB: درایور رسمی MongoDB برای Node.js. این یک API سطح بالا در بالای mongodb-core ارائه می دهد که برای کاربران نهایی در نظر گرفته شده است.

Npm: مدیر بسته برای جاوا اسکریپت است.

Nodemon: این یک اسکریپت مانیتور ساده برای استفاده در طول توسعه یک برنامه node.js است، فایل های موجود در دایرکتوری که nodemon در آن راه اندازی شده است را مشاهده می کند و در صورت تغییر هر فایل، nodemon به طور خودکار برنامه نود شما را مجددا راه اندازی می کند.

Nodemailer: این ماژول ارسال ایمیل از یک برنامه Node.js را امکان پذیر می کند.

Optimist: یک کتابخانه node.js برای تجزیه گزینه با هش argv است.

Phantomjs: یک نصب کننده NPM برای PhantomJS، وب کیت بدون هد با JS API. از استانداردهای مختلف وب پشتیبانی سریع و بومی دارد: مدیریت DOM، انتخابگر CSS، JSON، Canvas و SVG.

Passport: یک میان افزار ساده و بدون مزاحم احراز هویت برای Node.js. پاسپورت از استراتژی ها برای احراز هویت درخواست ها استفاده می کند. استراتژی ها می توانند از تأیید اعتبار نام کاربری و رمز عبور یا احراز هویت با استفاده از OAuth یا OpenID متغیر باشند.

Q :کتابخانه ای برای وعده ها است. یک وعده شیئی است که مقدار بازگشتی یا استثنای پرتاب شده ای را که تابع ممکن است در نهایت ارائه کند را نشان می دهد.

درخواست: درخواست مشتری درخواست HTTP ساده شده است که امکان برقراری تماس های http را فراهم می کند. از HTTPS پشتیبانی می کند و به طور پیش فرض تغییر مسیرها را دنبال می کند.

Socket.io: یک سرور فریمورک بلادرنگ node.js است.

Sails: Sailsچارچوب مبتنی بر API برای ساخت برنامه‌های بلادرنگ، با استفاده از قراردادهای MVC (بر اساس Express و Socket.io)
از طریق: ساخت جریان ساده را امکان پذیر می کند. این یک راه آسان برای ایجاد یک جریان است که هم قابل خواندن و هم قابل نوشتن باشد.

Underscore: Underscore.js یک کتابخانه کمربند کاربردی برای جاوا اسکریپت است که از مظنونین عملکردی معمول (هر کدام، نقشه، کاهش، فیلتر...) بدون گسترش هیچ گونه شیی اصلی جاوا اسکریپت پشتیبانی می کند.

Validator: یک ماژول nodejs برای کتابخانه ای از اعتبار سنجی رشته ها و ضدعفونی کننده ها.

Winston: یک کتابخانه گزارش غیرهمگام چند حمل و نقل برای Node.js

Ws: یک سرویس گیرنده وب سوکت، سرور و کنسول ساده برای استفاده، سریع و کاملاً آزمایش شده برای node.js

Xml2js: یک مبدل شیء XML به جاوا اسکریپت ساده

Yo: یک ابزار CLI برای اجرای ژنراتورهای Yeoman

Zmq: اتصالات برای node.js و io.js به ZeroMQ. این یک کتابخانه پیام رسانی ناهمزمان با کارایی بالا است که هدف آن استفاده در برنامه های کاربردی توزیع شده یا همزمان است.

22- EventEmitter در Node.js چیست؟

تمام اشیایی که رویدادها را منتشر می کنند، اعضای کلاس EventEmitter هستند. این اشیاء یک تابع eventEmitter.on را نشان می‌دهند که به یک یا چند تابع اجازه می‌دهد به رویدادهای نام‌گذاری شده توسط شیء متصل شوند.

هنگامی که شی EventEmitter یک رویداد را منتشر می کند، تمام توابع متصل به آن رویداد خاص به صورت همزمان فراخوانی می شوند. تمام مقادیر بازگردانده شده توسط شنوندگان فراخوانی نادیده گرفته شده و نادیده گرفته خواهند شد.

مثال:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener #2
var listner2 = function listner2() {
   console.log('listner2 executed.');
}

// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);

// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);

var eventListeners = require('events').EventEmitter.listenerCount
   (eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

// Fire the connection event 
eventEmitter.emit('connection');

// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");

// Fire the connection event 
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

console.log("Program Ended.");

خروجی:

2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.

23 چند نوع استریم در node.js وجود دارد؟

جریان‌ها اشیایی هستند که به شما امکان می‌دهند داده‌ها را از یک منبع بخوانید یا داده‌ها را به یک مقصد بنویسید. چهار نوع جریان وجود دارد:

Readable - جریانی که برای عملیات خواندن استفاده می شود.
Writable - جریانی که برای عملیات نوشتن استفاده می شود.
Duplex - جریانی که می تواند هم برای عملیات خواندن و هم برای نوشتن استفاده شود.
Transform- یک نوع جریان دوبلکس که در آن خروجی بر اساس ورودی محاسبه می شود.

هر نوع Stream یک نمونه EventEmitter است و چندین رویداد را در زمان‌های مختلف پرتاب می‌کند:

data- این رویداد زمانی فعال می شود که داده ای برای خواندن در دسترس باشد.
end - این رویداد زمانی فعال می شود که داده دیگری برای خواندن وجود نداشته باشد.
error - این رویداد زمانی فعال می شود که در دریافت یا نوشتن داده ها خطایی وجود داشته باشد.
finish - این رویداد زمانی فعال می شود که تمام داده ها به سیستم زیرین منتقل شوند.

خواندن از یک جریان (stream):

var fs = require("fs");
var data = '';

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Set the encoding to be utf8. 
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function() {
   console.log(data);
});

readerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

نوشتن در یک جریان:

var fs = require("fs");
var data = 'Simply Easy Learning';

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Write the data to stream with encoding to be utf8
writerStream.write(data,'UTF8');

// Mark the end of file
writerStream.end();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});

writerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

لوله کشی جریان ها (Piping):

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

var fs = require("fs");

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Pipe the read and write operations
// read input.txt and write data to output.txt
readerStream.pipe(writerStream);

console.log("Program Ended");

24- رمزنگاری در Node.js چیست؟ چگونه اطلاعات امن را در Node.js رمزگذاری می کنید؟

ماژول Node.js Crypto از رمزنگاری پشتیبانی می کند. این قابلیت رمزنگاری را ارائه می‌کند که شامل مجموعه‌ای از بسته‌بندی‌ها برای هش HMAC SSL، رمزگشایی، رمزگشایی، امضا و تأیید توابع است.

Hash: یک هش یک رشته بیت با طول ثابت است، یعنی به صورت رویه ای و قطعی از برخی بلوک دلخواه از داده های منبع تولید می شود.

HMAC :HMAC مخفف عبارت Hash-based Message Authentication Code است. این فرآیندی برای اعمال یک الگوریتم هش برای داده ها و یک کلید مخفی است که منجر به یک هش نهایی می شود.

مثال رمزگذاری با استفاده از Hash و HMAC:

const crypto = require('crypto');  
const secret = 'abcdefg';  
const hash = crypto.createHmac('sha256', secret)  
                   .update('Welcome to JavaTpoint')  
                   .digest('hex');  
console.log(hash);  

مثال رمزگذاری با استفاده از Cipher:

const crypto = require('crypto');  
const cipher = crypto.createCipher('aes192', 'a password');  
var encrypted = cipher.update('Hello JavaTpoint', 'utf8', 'hex');  
encrypted += cipher.final('hex');  
console.log(encrypted);

مثال رمزگشایی با استفاده از Decipher:

const crypto = require('crypto');  
const decipher = crypto.createDecipher('aes192', 'a password');  
var encrypted = '4ce3b761d58398aed30d5af898a0656a3174d9c7d7502e781e83cf6b9fb836d5';  
var decrypted = decipher.update(encrypted, 'hex', 'utf8');  
decrypted += decipher.final('utf8');  
console.log(decrypted);  

25- کاربرد ماژول DNS در Node.js چیست؟

DNS یک ماژول گره است که برای انجام تسهیلات تفکیک نام استفاده می شود که توسط سیستم عامل ارائه می شود و همچنین برای انجام جستجوی واقعی DNS استفاده می شود. بدون نیاز به به خاطر سپردن آدرس های IP - سرورهای DNS راه حلی عالی برای تبدیل نام دامنه یا زیر دامنه به آدرس IP ارائه می دهند. این ماژول یک پوشش شبکه ناهمزمان ارائه می دهد و می تواند با استفاده از نحو زیر وارد شود.

const dns = require('dns');

مثال: تابع ()dns.lookup

const dns = require('dns');  
dns.lookup('www.google.com', (err, addresses, family) => {  
  console.log('addresses:', addresses);  
  console.log('family:',family);  
});  

مثال: توابع ()reverse4 و ()reverse

const dns = require('dns');  
dns.resolve4('www.google.com', (err, addresses) => {  
  if (err) throw err;  
  console.log(`addresses: ${JSON.stringify(addresses)}`);  
  addresses.forEach((a) => {  
    dns.reverse(a, (err, hostnames) => {  
      if (err) {  
        throw err;  
      }  
      console.log(`reverse for ${a}: ${JSON.stringify(hostnames)}`);  
    });  
  });  
});

مثال: نام localhost را با استفاده از تابع lookupService() چاپ کنید

const dns = require('dns');  
dns.lookupService('127.0.0.1', 22, (err, hostname, service) => {  
  console.log(hostname, service);  
    // Prints: localhost  
});

26- مکانیسم های امنیتی موجود در Node.js چیست؟

با استفاده از ماژول Helmet

Helmet با تنظیم هدرهای مختلف HTTP، مانند:

X-Frame-Options برای کاهش حملات clickjacking،
Strict-Transport-Security برای حفظ کاربران خود در HTTPS،
X-XSS-Protection برای جلوگیری از حملات بازتابی XSS،
X-DNS-Prefetch-Control برای غیرفعال کردن واکشی اولیه DNS مرورگرها.

const express = require('express')
const helmet = require('helmet')
const app = express()

app.use(helmet())

تایید ورودی کاربر

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

برای اعتبارسنجی ورودی کاربر، یکی از بهترین کتابخانه هایی که می توانید انتخاب کنید joi است. Joi یک زبان توصیف طرحواره اشیاء و اعتباردهنده برای اشیاء جاوا اسکریپت است.

const Joi = require('joi');

const schema = Joi.object().keys({
    username: Joi.string().alphanum().min(3).max(30).required(),
    password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/),
    access_token: [Joi.string(), Joi.number()],
    birthyear: Joi.number().integer().min(1900).max(2013),
    email: Joi.string().email()
}).with('username', 'birthyear').without('password', 'access_token')

// Return result
const result = Joi.validate({
    username: 'abc',
    birthyear: 1994
}, schema)
// result.error === null -> valid

ایمن سازی Regular Expressions

عبارات منظم یک راه عالی برای دستکاری متون و دریافت قسمت های مورد نیاز از آنها است. با این حال، یک بردار حمله به نام Regular Expression Denial of Service حمله وجود دارد که این واقعیت را آشکار می‌کند که اکثر پیاده‌سازی‌های Regular Express ممکن است برای ورودی‌های ساخته‌شده خاص به موقعیت‌های شدید برسند، که باعث می‌شود آنها بسیار کند کار کنند.

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

نمونه هایی از الگوهای عبارات با قاعده مخرب:

(a+)+
([a-zA-Z]+)*
(a|aa)+

Security.txt

Security.txt استانداردی را برای کمک به سازمان‌ها تعریف می‌کند تا فرآیندی را برای محققان امنیتی برای افشای امن آسیب‌پذیری‌های امنیتی تعریف کنند.

const express = require('express')
const securityTxt = require('express-security.txt')

const app = express()

app.get('/security.txt', securityTxt({
  // your security address
  contact: 'email@example.com',
  // your pgp key
  encryption: 'encryption',
  // if you have a hall of fame for securty resourcers, include the link here
  acknowledgements: 'http://acknowledgements.example.com'
}))

27- انواع توابع API در Node.js را نام ببرید؟

دو نوع تابع API در Node.js وجود دارد:

  • Asynchronous, Non-blocking functions
  • Synchronous, Blocking functions

 Blocking functions

در یک عملیات مسدود کردن، اجرای تمام کدهای دیگر تا زمانی که یک رویداد I/O که منتظر آن است، رخ دهد مسدود می شود. توابع مسدود کردن به صورت همزمان اجرا می شوند.

مثال:

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
console.log(data);
// moreWork(); will run after console.log

خط دوم کد، اجرای جاوا اسکریپت اضافی را تا زمانی که کل فایل خوانده شود مسدود می کند. ()moreWork فقط بعد از Console.log فراخوانی می شود

Non-blocking functions

در یک عملیات غیرمسدود، چندین تماس ورودی/خروجی را می توان بدون توقف اجرای برنامه انجام داد. توابع غیرمسدود کننده به صورت ناهمزمان اجرا می شوند.

مثال:

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
// moreWork(); will run before console.log

از آنجایی که ()fs.readFile غیرمسدودکننده است، ()moreWork لازم نیست قبل از فراخوانی منتظر کامل شدن فایل خوانده شود. این امکان را برای توان بالاتر فراهم می کند.

28- Node.js چگونه رشته های فرزند را مدیریت می کند؟

Node.js یک زبان رشته ای واحد است که در پس زمینه از چندین رشته برای اجرای کد ناهمزمان استفاده می کند. Node.js غیرمسدودکننده است، به این معنی که همه توابع (بازگشت های تماس) به حلقه رویداد واگذار می شوند و توسط رشته های مختلف (یا می توانند) اجرا شوند. که توسط Node.js زمان اجرا مدیریت می شود.

برنامه Nodejs Primary در یک حلقه رویداد اجرا می شود که در یک رشته واحد قرار دارد.

ورودی/خروجی پس‌زمینه در یک Thread Pool اجرا می‌شود که فقط برای C/C++ یا سایر ماژول‌های کامپایل‌شده/بومی قابل دسترسی است و عمدتاً برای JS شفاف است.

Node v11/12 اکنون دارای worker_threads آزمایشی است که گزینه دیگری است.

Node.js از انشعاب چندین فرآیند (که بر روی هسته های مختلف اجرا می شوند) پشتیبانی می کند.

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

ما می‌توانیم پیام‌ها را به فرآیند فورکی (که اسکریپت متفاوتی است) و از فرآیند فورکی با ارسال تابع به پردازش مسلط کنیم.

29- روش ترجیحی برای حل استثناهای کنترل نشده در Node.js چیست؟

استثناهای کنترل نشده در Node.js را می توان در سطح Process با پیوست کردن یک handler برای رویداد uncaughtException گرفت.

process.on('uncaughtException', function(err) {
    console.log('Caught exception: ' + err);
});

Process یک شی سراسری است که اطلاعاتی در مورد فرآیند Node.js فعلی ارائه می دهد. فرآیند، یک تابع شنونده است که همیشه به رویدادها گوش می دهد.

چند رویداد عبارتند از:

  1. Exit
  2. disconnect
  3. unhandledException
  4. rejectionHandled

30- Node.js چگونه از پلتفرم های چندپردازنده ای پشتیبانی می کند و آیا به طور کامل از تمام منابع پردازنده استفاده می کند؟

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

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

خوشه از دو نوع توزیع بار پشتیبانی می کند:

1 فرآیند اصلی به یک پورت گوش می دهد، اتصال جدید را می پذیرد و آن را به یک فرآیند کودک به صورت دور روبین اختصاص می دهد.

2 فرآیند اصلی پورت را به یک پردازش فرزند اختصاص می دهد و خود پردازش فرزند به پورت گوش می دهد.


منبع: وب سایت github

نویسنده شوید
دیدگاه‌های شما

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