آموزش Node.js: ماژول‌ های os ،path و events — بخش دهم

۱۹۱ بازدید
آخرین به‌روزرسانی: ۱۸ شهریور ۱۴۰۲
زمان مطالعه: ۷ دقیقه
آموزش Node.js: ماژول‌ های os ،path و events — بخش دهم

در بخش قبلی این سری مقالات آموزش Node.js در مورد ماژول fs و کارکردهای مختلف آن صحبت کردیم، در این بخش ادامه کارکردهای ماژول fs را به همراه برخی امکانات ماژول‌های دیگر Node.js مانند ماژول os ،path و events مورد بررسی قرار می‌دهیم. برای مطالعه بخش قبلی این مجموعه مطلب آموزشی به لینک زیر مراجعه کنید:

چنان که در بخش قبلی این سری مقالات نیز توضیح دادیم، ماژول fs برای کار با فایل‌سیستم محلی یا ریموت امکانات مناسبی ارائه می‌کند. شما نیازی به نصب این ماژول ندارید، چون بخشی از هسته مرکزی Node.js است و کافی است آن را require کنید:

1const fs = require('fs')

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

  • ()fs.access – بررسی می‌کند که آیا فایل موجود است و آیا Node مجوز دسترسی به آن را دارد یا نه.
  • ()fs.appendFile – داده‌ها را به فایل الحاق می‌کند. اگر فایل موجود نباشد، آن را ایجاد می‌کند.
  • ()fs.chmod – مجوزهای فایل تعیین‌شده برای نام فایل ارسالی را تغییر می‌دهد. با متدهای ()fs.lchmod و ()fs.fchmod مرتبط است.
  • ()fs.chown – مالک گروه یک فایل را که نام فایل آن ارسال شده است تغییر می‌دهد. با متدهای ()fs.fchown و ()fs.lchown مرتبط است.
  • ()fs.close – توصیفگر یک فایل را می‌بندد.
  • ()fs.copyFile – یک فایل را کپی می‌کند.
  • ()fs.createReadStream – یک استریم فایل قابل خواندن می‌سازد.
  • ()fs.createWriteStream - یک استریم فایل قابل نوشتن می‌سازد.
  • ()fs.link - یک هایپرلینک به فایل می‌سازد.
  • ()fs.mkdir – یک پوشه جدید می‌سازد.
  • ()fs.mkdtemp – یک دایرکتوری موقت می‌سازد.
  • ()fs.open – حالت فایل را تعیین می‌کند.
  • ()fs.readdir – محتوای یک دایرکتوری را می‌خواند.
  • ()fs.readFile - محتوای یک فایل را می‌خواند. با متد ()fs.read مرتبط است.
  • ()fs.readlink - مقدار یک پیوند نمادین را می‌خواند.
  • ()fs.realpath - اشاره‌گرهای مسیر نسبی فایل (. و..) را به مسیر کامل تبدیل می‌کند.
  • ()fs.rename  - نام یک فایل یا پوشه را تغییر می‌دهد.
  • ()fs.rmdir – یک دایرکتوری را حذف می‌کند.
  • ()fs.stat – وضعیت یک فایل که نام فایل آن ارسال شده را تعیین می‌کند. با متدهای ()fs.fstat و ()fs.lstat مرتبط است.
  • ()fs.symlink – یک پیوند نمادین جدید به فایل ایجاد می‌کند.
  • ()fs.truncate – فایلی که نام فایل آن ارسال شده را تا طول مشخص شده کوتاه می‌کند. با متد ()fs.ftruncate مرتبط است.
  • ()fs.unlink – یک فایل یا پیوند نمادین را حذف می‌کند.
  • ()fs.unwatchFile – بررسی تغییرات یک فایل را متوقف می‌کند.
  • ()fs.utimes - زمان فایلی که نامش ارسال شده را تغییر می‌دهد. با متد ()fs.futimes مرتبط است.
  • ()fs.watchFile – شروع به تحت نظر گرفتن تغییرات یک فایل می‌کند. با متد ()fs.watch مرتبط است.

()fs.writeFile – داده‌ها را در یک فایل می‌نویسد. با متد ()fs.write مرتبط است.

نکته جالب در مورد ماژول fs این است که همه متدها به صورت پیش‌فرض ناهمگام هستند، اما می‌توان با استفاده از کلیدواژه Sync آن‌ها را به صورت همگام نیز اجرا کرد. برای نمونه: به مثال‌های زیر توجه کنید:

  • ()fs.rename
    • ()fs.renameSync
  • ()fs.write
    • ()fs.writeSync

بدین ترتیب تغییر بزرگی در گردش کار اپلیکیشن شما ایجاد می‌شود. Node 10 به صورت آزمایشی از API مبتنی بر Promise پشتیبانی می‌کند. برای مثال می‌توان متد ()fs.rename را بررسی کرد. API ناهمگام با استفاده از یک callback به صورت زیر است:

1const fs = require('fs')
2fs.rename('before.json', 'after.json', (err) => {
3    if (err) {
4        return console.error(err)
5    }
6    //done
7})

API همگام را می‌توان به صورت زیر به همراه یک بلوک try/catch برای مدیریت خطاها استفاده کرد:

1const fs = require('fs')
2try {
3    fs.renameSync('before.json', 'after.json') //done
4} catch (err) {
5    console.error(err)
6}

تفاوت اصلی در این است که اجرای اسکریپت در مثال دوم مسدود می‌شود تا این که عملیات فایل به پایان برسد.

ماژول path در Node.js

ماژول path کارکردهای مفید زیادی برای دسترسی و تعامل با فایل‌سیستم در اختیار ما قرار می‌دهد.

همانند ماژول fs این ماژول هم نیازی به نصب ندارد و بخشی از هسته مرکزی Node.js است که صرفاً با require کردن در اختیار ما قرار می‌گیرد:

1const path = require('path')

این ماژول path.sep را ارائه می‌کند که جداکننده قطعات مسیر (روی ویندوز \ و روی لینوکس و مک /) و path.delimiter را ارائه می‌کند که کاراکتر جداکننده مسیر (روی ویندوز ; و روی لینوکس و مک : ) را مشخص می‌سازد.

در ادامه می‌توانید توضیحات مربوط به هر کدام از متدهای ماژول path را مشاهده کنید.

()path.basename: آخرین بخش از یک مسیر را بازگشت می‌دهد. با استفاده از پارامتر دوم می‌توان پسوند فایل را فیلتر کرد.

1require('path').basename('/test/something') //somethingrequire('path').basename('/test/something.txt') //something.txtrequire('path').basename('/test/something.txt', '.txt') //something

()path.dirname: بخش دایرکتوری مسیر را بازگشت می‌دهد:

1require('path').dirname('/test/something') // /testrequire('path').dirname('/test/something/file.txt') // /test/something

()path.extname: بخش پسوند فایل یک مسیر را بازگشت می‌دهد:

1require('path').dirname('/test/something') // ''require('path').dirname('/test/something/file.txt') // '.txt'

()path.isAbsolute: در صورتی که مسیر مطلق باشد مقدار true بازگشت می‌دهد:

1require('path').isAbsolute('/test/something') // truerequire('path').isAbsolute('./test/something') // false

()path.join: دو یا چند بخش مسیر را به هم پیوند می‌دهد:

1const name = 'flavio'require('path').join('/', 'users', name, 'notes.txt') //'/users/flavio/notes.txt'

()path.normalize: این متد مسیر واقعی را در زمانی که شامل مشخصه‌های نسبی . یا .. یا // باشد محاسبه می‌کند:

1require('path').normalize('/users/flavio/..//test.txt') ///users/test.txt

()path.parse: مسیر را به یک شیء تجزیه می‌کند که قطعات آن مسیر را تشکیل می‌دهند:

  • Root: ریشه
  • Dir: مسیر پوشه آغازین از پوشه
  • Base: نام فایل + پسوند فایل
  • Name: نام فایل
  • Ext: پسوند فایل

به مثال زیر توجه کنید:

1require('path').parse('/users/test.txt')

خروجی:

{ root: '/', dir: '/users', base: 'test.txt', ext: '.txt', name: 'test'}

()path.relative: دو مسیر به عنوان آرگومان می‌گیرد و مسیر نسبی را از مسیر اول به مسیر دوم بر مبنای دایرکتوری کاری فعلی بازگشت می‌دهد. به مثال زیر توجه کنید:

1require('path').relative('/Users/flavio', '/Users/flavio/test.txt') //'test.txt'require('path').relative('/Users/flavio', '/Users/flavio/something/test.txt') //'something/test.txt'

()path.resolve: با محاسبه یک مسیر نسبی با استفاده از ()path.resolve می‌توانید مسیر مطلق را محاسبه کنید:

1path.resolve('flavio.txt') //'/Users/flavio/flavio.txt' if run from my home folder

با تعیین پارامتر دوم، resolve از مسیر اولیه عنوان مبنایی برای دومی استفاده می‌کند.

1path.resolve('tmp', 'flavio.txt')//'/Users/flavio/tmp/flavio.txt' if run from my home folder

اگر پارامتر اول با یک اسلش (/) آغاز شود، به این معنی است که مسیر مطلق است:

1path.resolve('/etc', 'flavio.txt')//'/etc/flavio.txt'

ماژول os در Node.js

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

1const os = require('os')

این ماژول برخی مشخصه‌های مفید دارد که موارد مهمی را در ارتباط با مدیریت فایل‌ها در اختیار ما قرار می‌دهند:

  • os.EOL توالی جداکننده را تعیین می‌کند. این مشخصه روی سیستم‌های لینوکس و مک n\ و روی ویندوز r\n\ است.
  • زمانی که از لینوکس و macOS صحبت می‌کنیم، منظور ما پلتفرم POSIX است. این خلاصه‌سازی برای ساده‌تر شدن کار است وگرنه Node.js روی سیستم‌های عامل دیگر این خانواده نیز قابل اجرا است.
  • os.constants.signals همه محتواهای مرتبط با مدیریت سیگنال‌های پردازش مانند SIGHUP ،SIGKILL و غیره را در اختیار ما قرار می‌دهد.
  • os.constants.errno محتواهای گزارش‌دهی خطا مانند EADDRINUSE ،EOVERFLOW و غیره را تنظیم می‌کند.

برای کسب اطلاعات بیشتر به این صفحه (+) مراجعه کنید.

اکنون متدهای اصلی را که ماژول os در اختیار ما قرار می‌دهد، مرور می‌کنیم:

()os.arch – رشته‌ای مانند arm ،x64 و arm64 بازگشت می‌دهد که معماری سیستم را مشخص می‌سازد.

()os.cpus – اطلاعاتی در مورد CPU-های موجود روی سیستم بازگشت می‌دهد. به مثال زیر توجه کنید:

[{ model: 'Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz', speed: 2400, times: { user: 281685380, nice: 0, sys: 187986530, idle: 685833750, irq: 0 } }, { model: 'Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz', speed: 2400, times: { user: 282348700, nice: 0, sys: 161800480, idle: 703509470, irq: 0 } }]

()os.endianness - بسته به این که Node.js به وسیله Big Endian یا Little Endian کامپایل شده باشد به ترتیب رشته‌های BE یا LE را بازگشت می‌دهد.

()os.freemem – تعداد بایت‌هایی را بازگشت می‌دهد که حافظه آزاد سیستم را نمایش می‌دهند.

()os.homedir - مسیر دایرکتوری home کاربر جاری را بازگشت می‌دهد. برای مثال:

'/Users/flavio'

os.hostname - این متد hostname را بازگشت می‌دهد.

()os.loadavg - میانگین محاسبه انجام یافته از سوی سیستم عامل را بازگشت می‌دهد. این متد تنها روی سیستم‌های لینوکس و مک مقادیر معنی‌دار بازگشت می‌دهد. به مثال زیر توجه کنید:

[3.68798828125, 4.00244140625, 11.1181640625]

()os.networkInterfaces - جزییات اینترفیس‌های شبکه موجود روی سیستم را بازگشت می‌دهد. به مثال زیر توجه کنید:

{ lo0: [{ address: '127.0.0.1', netmask: '255.0.0.0', family: 'IPv4', mac: 'fe:82:00:00:00:00', internal: true }, { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', family: 'IPv6', mac: 'fe:82:00:00:00:00', scopeid: 0, internal: true }, { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', family: 'IPv6', mac: 'fe:82:00:00:00:00', scopeid: 1, internal: true }], en1: [{ address: 'fe82::9b:8282:d7e6:496e', netmask: 'ffff:ffff:ffff:ffff::', family: 'IPv6', mac: '06:00:00:02:0e:00', scopeid: 5, internal: false }, { address: '192.168.1.38', netmask: '255.255.255.0', family: 'IPv4', mac: '06:00:00:02:0e:00', internal: false }], utun0: [{ address: 'fe80::2513:72bc:f405:61d0', netmask: 'ffff:ffff:ffff:ffff::', family: 'IPv6', mac: 'fe:80:00:20:00:00', scopeid: 8, internal: false }] }

()os.platform - پلتفرمی که Node.js روی آن کامپایل شده است را بازگشت می‌دهد:

  • darwin
  • freebsd
  • linux
  • openbsd
  • win32
  • و غیره

()os.release - رشته‌ای بازگشت می‌دهد که شماره انتشار سیستم عامل را مشخص می‌سازد.

()os.tmpdir – مسیر پوشه موقت را بازگشت می‌دهد.

()os.totalmem - تعداد بایت‌هایی را بازگشت می‌دهد که حافظه کلی موجود در سیستم را نشان می‌دهد.

()os.type – سیستم عامل را مشخص می‌کند:

  • Linux
  • Darwin روی مک
  • Windows_NT روی ویندوز

()os.uptime – تعداد ثانیه‌هایی که رایانه روشن بوده است را نمایش می‌دهد.

ماژول events در Node.js

ماژول events کلاس EventEmitter را در اختیار ما قرار می‌دهد که یک مفهوم کلیدی برای کار با رویدادها در Node.js محسوب می‌شود. برای اعلان کردن آن از روش زیر استفاده می‌کنیم:

1()const EventEmitter = require('events')const door = new EventEmitter

«شنونده رویداد» (event listener) ساختار خاص خود را دارد و از این رویدادها استفاده می‌کند:

  • newListener که در زمان اضافه شدن شنونده استفاده می‌شود.
  • removeListener در زمان حذف شنونده مورد استفاده قرار می‌گیرد.

در ادامه فهرستی از مفیدترین متدهای این ماژول را مشاهده می‌کنید:

()emitter.addListener - نام مستعاری برای ()emitter.on است.

()emitter.emit - یک رویداد منتشر می‌کند. این متد به صورت همگام همه شنونده‌های رویداد را به ترتیبی که ثبت شده‌اند فراخوانی می‌کند.

()emitter.eventNames – آرایه‌ای از رشته‌ها بازگشت می‌دهد که نماینده رویدادهای ثبت‌شده روی EventListener جاری است:

door.eventNames()

()emitter.getMaxListeners – بیشینه مقدار شنونده‌هایی که فرد می‌تواند روی یک شیء EventListener ثبت کند بازگشت می‌دهد. مقدار پیش‌فرض آن 10 است، اما می‌توان با استفاده از متد ()setMaxListeners به صورت زیر این مقدار را افزایش یا کاهش داد:

door.getMaxListeners()

()emitter.listenerCount – تعداد شنونده‌های رویدادی که به صورت پارامتر ارسال شده است را بازگشت می‌دهد:

door.listenerCount('open')

()emitter.listeners – آرایه‌ای از شنونده‌های رویدادی که به صورت پارامتر ارسال شده است را بازگشت می‌دهد:

door.listeners('open')

()emitter.of - نام مستعاری برای متد ()emitter.removeListener است که در نسخه 10 Node اضافه شده است.

()emitter.on - یک تابع Callback اضافه می‌کند که وقتی یک رویداد منتشر شود فراخوانی خواهد شد. به مثال زیر توجه کنید:

door.on('open', () => { console.log('Door was opened')})

()emitter.once – یک تابع Callback اضافه می‌کند که وقتی یک رویداد برای نخستین بار پس از ثبت شدن منتشر می‌شود فراخوانی خواهد شد. این Callback تنها یک بار فراخوانی می‌شود و دیگر تکرار نخواهد شد.

const EventEmitter = require('events')const ee = new EventEmitter()
ee.once('my-event', () => {//call callback function once})

()emitter.prependListener – زمانی که یک شنونده با استفاده از on یا addListener اضافه می‌شود، به انتهای صف شنونده‌ها اضافه می‌شود و پس از همه فراخوانی می‌شود. با استفاده از prependListener این شنونده به صف اضافه می‌شود و پیش از همه شنونده‌های قبلی موجود فراخوانی خواهد شد.

()emitter.removeAllListeners - همه شنونده‌‌های یک شیء رویداد را که به رویداد خاصی گوش می‌دهند حذف می‌کند:

door.removeAllListeners('open')

()emitter.removeListener – یک شنونده خاص را حذف می‌کند. می‌توانید این کار را با ذخیره کردن تابع Callback در یک متغیر انجام دهید. با اضافه کردن آن می‌توانید در ادامه به آن ارجاع بدهید:

const doSomething = () => {}door.on('open', doSomething)door.removeListener('open', doSomething)

()emitter.setMaxListeners – بیشینه مقدار شنونده‌هایی که فرد می‌تواند به یک شیء EventListener اضافه کند را تعیین می‌کند. مقدار پیش‌فرض آن 10 است، اما می‌توان آن را افزایش یا کاهش داد:

door.setMaxListeners(50)

بدین ترتیب به پایان بخش دهم از سری مقالات آموزش جامع Node.js می‌رسیم. در بخش بعدی در مورد ماژول http با شما صحبت خواهیم کرد. برای مشاهده بخش بعدی به لینک زیر بروید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
freecodecamp
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *