به عنوان یک توسعه دهنده فرانتاند، باید بدانیم که چگونه میتوانیم به طور موثر با فایلها در NodeJS کار کرده و آنها را پردازش کنیم. در این مقاله قصد داریم تا به طور کامل درمورد کار با فایل سیستم در NodeJS صحبت کنیم.
جاوااسکریپت یک زبان برنامهنویسی محبوب در بین توسعهدهندگان وب است. زمانی که این زبان برای اولین بار منتشر شد، فقط توسعهدهندگان فرانتاند توانستند به خوبی از آن استفاده کنند، زیرا نمیدانستند چگونه جاوااسکریپت را خارج از مرورگر به کار بگیرند. اما پس از آن در سال ۲۰۰۹، اولین نسخه NodeJS منتشر شد. Node یک runtime جاوااسکریپت است که این امکان را به ما میدهد تا کد جاوااسکریپتی خود را خارج از مرورگر اجرا کنیم. به این ترتیب توسعهدهندگان فرانتاند توانستند به خوبی از این زبان استفاده نمایند. در حال حاضر، NodeJS از توسعه جاوااسکریپت پشتیبانی میکند و ششمین فناوری پر استفاده در بین برنامه نویسان میباشد.
برای مطالعه این مقاله نیاز به دانش زیاد NodeJS وجود ندارد، اما داشتن درک درست از جاوااسکریپت لازم است.
Node به عنوان یک فایل سرور عمل میکند. ما با استفاده از Node ماژول میتوانیم با فایلهای کامپیوتر خود کار کنیم و عملیاتهای مختلفی را انجام دهیم. هنگامی که در حال ساخت یک برنامه وب هستیم، ممکن است بخواهیم تصاویر، رزومه، ویدیوها یا داکیومنتهایی را در سرور آپلود کنیم. فایل سیستم NodeJS این توانایی را دارد تا همه این کارها را نجام دهد.
قبل از این که بیشتر درمود فایل سیستمها صحبت کنیم میخواهیم Node ماژولها را به طور کلی باهم بررسی کنیم.
در صورتی که با این اصطلاح آشنا نیستیم، Node ماژولها کد جاوااسکریپت با قابلیت استفاده مجدد هستند. به راحتی میتوانیم ماژولها را در طول پروژه خود import کنیم. هدف ماژولها این است که اطمینان حاصل شود که ما به طور مداوم یک کد را در طول پروژه تکرار نمیکنیم.
انواع مختلفی از Node ماژولها وجود دارد که عبارتند از: ماژولها local، ماژولهای built-in و ماژولهای third-party. در این مقاله ما بر روی ماژولهای built-in تمرکز خواهیم کرد.
در ادامه لیستی از ماژولهای built-in نود آمده است:
fs
ماژول فایل سیستم در Node میباشد.
ماژول fs
به ما این امکان را میدهد تا چندین عملیات انجام دهیم که شامل فایلها و پوشهها میشود. این عملیات عبارتند از:
برای شروع کار با این دنیای مدیریت فایل، ابتدا یک پوشه میسازیم. سپس یک فایل جاوااسکریپت ایجاد میکنیم. برای این کار میتوانیم از VS Code یا هر ویرایشگر متنی دیگر استفاده کنیم.
برای خواندن مستقیم فایلها از کامپیوتر خود، باید از متد()fs.readFile
استفاده کنیم. برای این کار باید فایلی که میخواهیم آن را بخوانیم، ایجاد کنیم. فرض کنید که این یک فایل txt با محتوای hello world
است. آن را dummyText.txt مینامیم.
اکنون چندین راه وجود دارد که بتوانیم یک فایل را با Node بخوانیم. این کار را میتوانیم یا با استفاده از ماژول http
، که فایل ما را در لوکال هاست میخواند انجام دهیم و یا این که از promiseها استفاده کنیم. ما هر دو روش را انجام داده و اینکه کدام یک بر دیگری ارجحیت دارد را نیز بررسی خواهیم کرد.
با ماژول http
شروع میکنیم. فایل JS خود را readfile.js
مینامیم(میتواند هر نام دیگری هم داشته باشد) و کد زیر را مینویسیم:
const http = require('http'); const fs = require('fs'); http.createServer(function (req, res) { fs.readFile('dummyText.txt', function(err, data) { res.writeHead(200, {'Content-type': 'text/html'}); res.write(data); return res.end(); }); }).listen(8080);
کد را ذخیره میکنیم و سپس cmd
را در file directory باز کرده و Node readfile.js را اجرا میکنیم:
C:\Users\nodefilesystem>node readfile.js
برای دیدن نتیجه به آدرس https://localhost:8080 میرویم. باید بتوانیم محتوای متنی که ساختیم را در مرورگر خود مشاهده کنیم.
اکنون میخواهیم این را با promiseها انجام دهیم. روش promise یک سبک برنامهنویسی مدرنتر است، زیرا ما از سینتکس جدید async و await استفاده میکنیم. فایل خود را با استفاده از promiseها میخوانیم.
// import promises const { readFile } = require('fs/promises'); async function readThisFile('./dummytext.txt') { try { const data = await readFile('/dummytext.txt'); console.log(data.toString()); } catch (error) { console.error(`Got an error trying to read the file: {error.message}`); } }
حال میخواهیم کدها را باهم بررسی کنیم. ماژول Node promises را با استفاده از فایل سیستم import کردیم. ماfs/Promises
را برای پردازش فایلهای خود با promiseها مورد استفاده قرار میدهیم.
همینطور برای پردازش فایلی که میخواهیم آن را بخوانیم از متد readFile
استفاده کردیم. با استفاده از promiseها میتوانیم فایلهای خود را به صورت asynchronous بخوانیم. در متد readFile
یک path به dummytext
داریم که میخواهیم آن را بخوانیم، سپس محتوای فایل را return میکنیم.
همچنین از روش مدیریت خطای try-catch استفاده کردیم تا اطمینان حاصل کنیم که میتوانیم آنچه را که پیام خطا میخواند به درستی کنترل کنیم. بنابراین، اگر مشکلی در کد قبل از خط catch وجود داشته باشد، به جای یک پیام خطای نامرتب، خروجی ” Got an error trying to read the file ” را نشان میدهد. مدیریت خطا همچنین از توقف برنامه در صورت مشاهده خطا جلوگیری میکند.
اکنون که با کار با فایل سیستم به روش promise آشنا شدیم، در ادامه مقاله از آن استفاده خواهیم کرد.
حال که میدانیم چگونه محتویات را از یک فایل موجود بخوانیم، میخواهیم یاد بگیریم چگونه باید یک فایل را ایجاد کنیم.
برای ایجاد یک فایل میتوانیم از یکی از سه متد appendFile()
، open()
و writeFile()
استفاده کنیم. ویرایشگر متن خود را باز کرده و با appendFile()
شروع میکنیم:
const { appendFile} = require('fs/promises'); async function appendToFile('anotherDummyText.txt', 'i love node') { try { await appendFile(fileName, data, { flag: 'w' }); console.log(`Appended data to ${fileName}`); } catch (error) { console.error(`Got an error trying to append the file: {error.message}`); } }
در این بخش میخواهیم کد بالا را کمی بیشتر بررسی کنیم. ما قبلاً ماژول را فراخوانی کردیم و اکنون از متد appendFile
برای نوشتن روی فایلی که قبلاً ایجاد کردیم استفاده میکنیم. اگر برنامه هیچ فایلی را با نامی که در تابع appendToFile
بیان کردیم پیدا نکند، آن را ایجاد خواهد کرد.
همچنین از روش مدیریت خطای try-catch برای اطمینان از کنترل خطاها استفاده کردیم.
پس از آن متد WriteFile
را بررسی میکنیم. تقریباً همان کد است، اما تنظیمات مربوط به خود را دارد:
const { writeFile } = require('fs/promises'); async function writeToFile('dummyText.txt', 'using write method') { try { await writeFile(fileName, data); console.log(`Wrote data to ${fileName}`); } catch (error) { console.error(`Got an error trying to write the file: ${error.message}`); } }
اکنون از متد writeFile
استفاده میکنیم که فایل را مستقیماً ایجاد کرده و دادهها را به آن اضافه مینماید. همچنین باید به کلمه کلیدی await
توجه داشته باشیم که برای اجرای یک promise موفق جاوااسکریپت به آن نیاز داریم.
یکی دیگر از بخشهای اصلی کار با فایلها، تغییر نام یک فایل موجود است. میخواهیم نگاهی به نحوه عملکرد آن بیندازیم:
const { rename } = require('fs/promises'); async function renameFile('dummytext.txt', 'changedDummyText.txt') { try { await rename(from, to); console.log(`Renamed ${from} to ${to}`); } catch (error) { console.error(`Got an error trying to rename the file: ${error.message}`); } }
همانطور که میبینیم، تابع async
ما این بار دو پارامتر دارد، اولی نام فعلی داکیومنتی که میخواهیم نام آن را تغییر دهیم و دومی نام جدیدی است که میخواهیم جایگزین کنیم.
همچنین dummyText.txt
را به changeDummyText.txt
تغییر دادیم.
برای حذف یک فایل، باید متد unlink
را فراخوانی کنیم. این بار به جای داشتن دو پارامتر، فقط یک پارامتر خواهیم داشت: نام یا مسیر فایلی که میخواهیم آن را حذف کنیم. ما در این بخش هم همچنان از روش مدیریت خطای try-catch خود برای کنترل خطاها و نمایش نام فایلی که حذف شده است در کنسول استفاده خواهیم کرد.
const { unlink } = require('fs/promises'); async function deleteFile('./dummytext.txt') { try { await unlink(filePath); console.log(`Deleted ${filePath}`); } catch (error) { console.error(`Got an error trying to delete the file: ${error.message}`); } }
در ابتدای مقاله اشاره کردیم که در ادامه یاد خواهیم گرفت چگونه فایلها را به روز رسانی کنیم، اما اگر دقت کرده باشید خواهید دید که قبلاً این کار را انجام دادهایم.
در بخشهای قبلی در مورد متد appendFile()
صحبت کردیم که اساساً اطلاعات کلیدی را تغییر میدهد و به ما این امکان را میدهد تا محتوای جدید فایل را بنویسیم. همچنین در مورد متد writeFile()
نیز صحبت کردیم که محتویات یک فایل را به روز رسانی میکند.
در این مقاله ما ابتدا در مورد اینکه NodeJS چیست و فایل سیستم چقدر اهمیت دارد صحبت کردیم. علاوه بر این، یاد گرفتیم که منظور از Node ماژول چیست. همه اینها برای درک ادامه آموزش بسیار مهم هستند.
همچنین باید به این نکته توجه داشته باشیم که عملیات بیشتری وجود دارد که میتوانیم با فایل سیستم در Node انجام دهیم. در این مقاله سعی کردیم فقط اصول اولیه و عملکردهای اولیه را پوشش دهیم.