۳ ماژول مفید داخلی Node.js — راهنمای کاربردی
Node.js برخی ماژولهای داخلی دارد، یعنی این ماژولها مانند دیگر ماژولها که از طریق Node.js نصب میکنیم و سپس با استفاده از ساختار require یا import در پروژه قرار میدهیم کار میکنند و چنان که از نام آنها مشخص است از قبل در محیط Node.js نصب شدهاند و از این رو همواره در دسترس ما قرار دارند. در این مقاله با 3 ماژول مفید داخلی Node.js آشنا خواهیم شد.
این ماژولها که میخواهیم معرفی کنیم از سوی تیم توسعه خود Node.js نگهداری میشوند، بنابراین همواره بهروز هستند و میتوانیم بدون نگرانی از آنها استفاده کنیم. برخی قابلیتهای این ماژولها که منسوخ میشوند را میتوان در مستندات رسمی آن پیدا کرد. بنابراین دلیلی برای عدم بررسی این ماژولها و استفاده از آنها در پروژههای آتی وجود ندارد.
readline: خواندن دادهها از جریانهای ورودی مانند کیبورد
باید اذعان کرد که کتابخانههای زیادی وجود دارند که امکان خواندن و پردازش ورودی از کنسول را فراهم میسازند، اما ماژول readline قابلیتهای بسیار جالبی دارد که در ادامه مورد بررسی قرار میدهیم.
اعلان و پردازش ورودی در کنسول
1const readline = require('readline')
2const rl = readline.createInterface({
3 input: process.stdin,
4 output: process.stdout,
5})
6console.log('Enter a number, Node will double it for you')
7rl.question('Your Number: ', (number) => {
8 console.log(parseInt(number) * 2)
9 rl.close()
10})
نکته مهم: ورودی در کنسول از سوی این ماژول همواره به صورت رشته دریافت میشود.
علاوه بر این در وهله نخست همواره باید با استفاده از تابع createInterface یک rl ایجاد کنیم که در مثال فوق مشخص شده است. در کد بعدی این موضوع را نادیده خواهیم گرفت.
هر ورودی که کاربر باید با اینتر تأیید کند را در خروجی ارائه میکند.
1rl.on('line', (input) => {
2 console.log('You entered: ${input}')
3})
بنابراین همانند rl.question عمل میکند، اما سؤال ندارد. اگر بخواهیم، میتوانیم روند خواندن از ورودی کاربر را با متد ()rl.clos در اینجا و همه تابعهای دیگر readline در هر زمان ببندیم. اگر کاربر خواست برنامه را با CTRL+C ببندد، آن را ثبت میکند.
1rl.on('SIGINT', (input) => {
2 console.log('you exited')
3 process.exit()
4})
هشدار: این تنها یک شنونده است، بنابراین برنامه باید به نوعی مثلاً با ()process.exit خاتمه یابد، در غیر این صورت کاربر نمیتواند با کلیدهای CTRL+C از برنامه خارج شود.
به علاوه، میتوانیم در عمل آن را با rs.question ترکیب کنیم تا ورودی کاربر الزامی باشد. بدین ترتیب اگر کاربر مقادیر yes یا y را وارد کند، میتوانیم برنامه را بنا به درخواست وی خاتمه دهیم.
1rl.on(‘SIGINT’, (input) => {
2 rl.question(‘Are you sure you want to exit? ‘, (answer) => {
3 if (answer.match(/^y(es)?$/i)) process.exit()
4 else console.log(‘glad you stay’)
5 })
6})
بدین ترتیب میتوانید مطمئن شوید که کاربر ناخواسته کلیدهای CTRL+C را نفشرده است.
child_process: اجرای دستورهای پوسته با Node
از ماژول child_process میتوان برای مقاصد مختلفی استفاده کرد، اما اساساً چنان که از نامش برمیآید برای اجرای پردازشها کمابیش در پسزمینه طراحی شده است. در ادامه شیوه استفاده از آن برای اجرای دستورهای پوسته (Shell) را به طوری که موجب از کار افتادن اپلیکیشن Node نشود نشان میدهیم.
از ls برای دیدن محتوای دایرکتوری سطح بالاتر استفاده کنید.
1const { exec } = require(‘child_process’)
2exec('cd .. && ls', (error, output) => {
3 if (error) throw error
4 console.log(output)
5})
از لحاظ نظری، هیچ محدودیتی وجود ندارد، فرامین ترمینال را میتوان هم روی ویندوز و هم لینوکس با استفاده از && به هم متصل ساخت و از این رو دستورهای مختلف میتوانند یکی پس از دیگری اجرا شوند.
میتوان exec را در چرخه اپلیکیشن Node به روش بسیار آسانی وارد کرد و از این رو امکان ارسال محتوا از یک فایل با استفاده از Express.js به صورت یک پاسخ HTTP به کاربر فراهم میشود. البته این مثال صرفاً برای روشن شدن موضوع طرح شده است:
1app.get(‘/’, (req, res) => {
2 exec(‘cat test.txt‘, (error, output) => {
3 res.send(output)
4 })
5})
vm: اجرای کد جاوا اسکریپت روی یک ماشین مجازی
احتمالاً vm یکی از جذابترین ماژولهای نود محسوب میشود، زیرا امکان انجام کارهای زیادی را دارد. توضیح خود را با کد کوچکی آغاز میکنیم:
1const vm = require('vm')
2
3const x = 1
4
5const context = { x }
6vm.createContext(context)
7
8const code = `
9 x = x + 40;
10 var y = 17;
11 var hello = function() { return "from the VM" }
12`
13
14vm.runInContext(code, context)
- x را به عنوان یک متغیر سراسری تعریف میکنیم که نکته خاصی ندارد، اما این موضوع را به خاطر داشته باشید.
- سپس متغیر x را درون چارچوب VM میبریم که این کار با استفاده از createContext انجام میشود.
- متغیر کد ما اینک کد جاوا اسکریپت است که باید در VM اجرا شود. در اینجا به x بدون این که کد خود را ایجاد کنیم دسترسی مییابیم. X صرفاً به این جهت در دسترس ما است که آن را به context ارسال کردهایم.
- همچنین دو متغیر دیگر ایجاد میکنیم. اگر میخواهید به متغیرها در چارچوب vm و بعدتر خارج از vm دسترسی پیدا کنید، احتمالاً نباید با let یا const بلکه باید با car تعریف شده باشند.
- در نهایت با استفاده از runInContext میتوانیم همه چیز را ترکیب کرده و context خود را با متغیر x اجرا کنیم که از دامنه سراسری قرض گرفتهایم و کد در vm اجرا میشود.
کار با VM
هر زمان که بخواهیم به متغیرها در VM context دسترسی پیدا کنیم، معنیاش این است که code میتواند این کار را با استفاده از شیء context انجام دهد:
console.log(context.x) // 41 console.log(context.y) // 17
چنان که میبینیم همه چیز مطابق انتظار است. از آنجا که x مقدار سراسری 1 را دارد و مقدار 40 در vm اضافه شده است، اینک در VM مقدار 41 را دارد.
اما اگر بخواهیم به متغیر x در دامنه سراسری دسترسی داشته باشیم، میبینیم که بدون تغییر مانده است:
console.log(context.hello()) // “from the VM”
بدین ترتیب به پایان این راهنما میرسیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای جاوا اسکریپت
- مجموعه آموزشهای برنامهنویسی
- Node.js چیست؟ — به زبان ساده
- آموزش Node.js: مفاهیم مقدماتی — بخش اول
- آموزش Node.js — مجموعه مقالات مجله فرادرس
==