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

معرفی NodeJS

جاوااسکریپت یک زبان برنامه‌نویسی محبوب در بین توسعه‌دهندگان وب است. زمانی که این زبان برای اولین بار منتشر شد، فقط توسعه‌دهندگان فرانت‌اند توانستند به خوبی از آن استفاده کنند، زیرا نمی‌دانستند چگونه جاوااسکریپت را خارج از مرورگر به کار بگیرند. اما پس از آن در سال ۲۰۰۹، اولین نسخه NodeJS منتشر شد. Node یک runtime جاوااسکریپت است که این امکان را به ما می‌دهد تا کد جاوااسکریپتی خود را خارج از مرورگر اجرا کنیم. به این ترتیب توسعه‌دهندگان فرانت‌اند توانستند به خوبی از این زبان استفاده نمایند. در حال حاضر، NodeJS از توسعه جاوااسکریپت پشتیبانی می‌کند و ششمین فناوری پر استفاده در بین برنامه نویسان می‌باشد.

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

فایل سیستم NodeJS

Node به عنوان یک فایل سرور عمل می‌کند. ما با استفاده از Node ماژول می‌توانیم با فایل‌های کامپیوتر خود کار کنیم و عملیات‌های مختلفی را انجام دهیم. هنگامی که در حال ساخت یک برنامه وب هستیم، ممکن است بخواهیم تصاویر، رزومه، ویدیوها یا داکیومنت‌هایی را در سرور آپلود کنیم. فایل سیستم NodeJS این توانایی را دارد تا همه این کارها را نجام دهد.

قبل از این که بیشتر درمود فایل سیستم‌ها صحبت کنیم می‌خواهیم Node ماژول‌ها را به طور کلی باهم بررسی کنیم.

منظور از Node ماژول چیست؟

در صورتی که با این اصطلاح آشنا نیستیم، Node ماژول‌ها کد جاوااسکریپت با قابلیت استفاده مجدد هستند. به راحتی می‌توانیم ماژول‌ها را در طول پروژه خود import کنیم. هدف ماژول‌ها این است که اطمینان حاصل شود که ما به طور مداوم یک کد را در طول پروژه تکرار نمی‌کنیم.

انواع مختلفی از Node ماژول‌ها وجود دارد که عبارتند از: ماژول‌ها local، ماژول‌های built-in و ماژول‌های third-party. در این مقاله ما بر روی ماژول‌های built-in تمرکز خواهیم کرد.

در ادامه لیستی از ماژول‌های built-in نود آمده است:

fsماژول فایل سیستم در Node می‌باشد.

نحوه کار با ماژول fs نود

ماژول 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 انجام دهیم. در این مقاله سعی کردیم فقط اصول اولیه و عملکردهای اولیه را پوشش دهیم.