JSON یک فرمت داده بسیار رایج است، بنابراین مهم است که همه چیز را در مورد این عملیات رایج یاد بگیرید.
خواندن و نوشتن فایل های JSON در Node.js امکان پذیر است. تنها کاری که باید انجام دهید این است که از ماژول fs همانطور که در راهنمای ساده ما توضیح داده شده است استفاده کنید.
خواندن و نوشتن فایل های JSON در Node.js
فرمت نشانه گذاری اشیاء جاوا اسکریپت که عموماً با نام JSON شناخته می شود، یک فرمت انتقال داده سبک است که به طور گسترده برای نمایش داده های ساخت یافته استفاده می شود. این یک قالب مبتنی بر متن است که خواندن و نوشتن آن برای انسان ها و تجزیه و تولید آن برای ماشین ها آسان است.
توانایی خواندن و نوشتن فایلهای JSON به صورت برنامهنویسی در Node.js به شما این امکان را میدهد که دادههای ساختاریافته را به صورت کارآمد و آسان ذخیره، مبادله و دستکاری کنید. نحوه خواندن، نوشتن و به روز رسانی فایل های JSON را با استفاده از ماژول سیستم فایل Node.js بیاموزید.
ماژول سیستم فایل Node.js
ماژول سیستم فایل Node.js (fs) در Node.js تعبیه شده است. این به شما امکان می دهد با سیستم فایل دستگاه خود تعامل داشته باشید. می توانید از آن برای خواندن محتویات یک فایل، ایجاد یک فایل جدید و حذف یک فایل و موارد دیگر استفاده کنید.
روش های ارائه شده توسط ماژول fs می توانند همزمان یا ناهمزمان باشند. روش های همزمان اجرای برنامه شما را تا زمانی که عملیات سیستم فایل کامل شود مسدود می کند. این روش ها معمولاً در انتهای نام خود عبارت «Sync» دارند. برای مثال readFileSync یا writeFileSync.
از طرف دیگر، روشهای ناهمزمان اجرای برنامه شما را مسدود نمیکنند و به آن اجازه میدهند تا در حین انجام عملیات فایل سیستم، به پردازش سایر وظایف ادامه دهد. این روش ها یک تابع فراخوانی را می پذیرند که پس از اتمام عملیات اجرا می شود. مثلا readFile یا writeFile.
هنگام تعامل با سیستم فایل، همیشه باید از روش های ناهمزمان برای حفظ ماهیت غیر مسدود کننده حلقه رویداد و بهبود عملکرد و پاسخگویی برنامه خود استفاده کنید.
با این حال، روشهای همزمان در سناریوهای خاصی جای خود را دارند، بهویژه زمانی که در حال نوشتن اسکریپتهای ساده یا انجام عملیات فایل یکباره هستید.
خواندن فایل های JSON با ماژول fs
برای خواندن یک فایل JSON، ابتدا ماژول fs ناهمزمان را در فایل اصلی خود وارد کنید. اینطوری:
const fs = require("node:fs/promises");
اگر از نسخه ای کمتر از Node.js v18 استفاده می کنید، ماژول fs را به این صورت وارد کنید:
const fs = require("fs/promises");
اگر می خواهید کل ماژول (همگام و ناهمزمان) را وارد کنید، /promises را حذف کنید.
شما می توانید یک فایل JSON را با استفاده از روش readFile بخوانید که دو آرگومان دارد: یک مسیر فایل و یک شی پیکربندی اختیاری. آرگومان config گزینه هایی را برای خواندن فایل مشخص می کند و می تواند یک شی با گزینه ها یا یک رمزگذاری رشته باشد.
گزینه های شی عبارتند از:
- encoding (رشته، پیشفرض “utf8”): این گزینه رمزگذاری کاراکتری را مشخص میکند که هنگام خواندن فایل از آن استفاده شود. رمزگذاری های رایج عبارتند از “utf8” برای فایل های متنی و “دودویی” برای فایل های باینری.
- flag (رشته، پیشفرض «r» است): این گزینه پرچم سیستم فایلی را که هنگام باز کردن فایل استفاده میشود، مشخص میکند. پرچم های رایج عبارتند از “r” برای خواندن و “w” برای نوشتن.
مثلا:
fs.readFile("./users.json", { encoding: "utf-8", flag: "r" })
.then((data) => {
const users = JSON.parse(data);
console.log(users);
})
.catch((error) => {
console.error('Error reading the JSON file:', error);
});
این کد یک فایل JSON به نام users.json را در دایرکتوری فعلی می خواند. وقتی داده های فایل را بازیابی می کنید، می توانید آن را از JSON به یک شی جاوا اسکریپت با استفاده از JSON.parse تجزیه کنید. این به شما امکان می دهد به داده ها به عنوان یک شی در کد خود دسترسی داشته باشید و آنها را دستکاری کنید.
برای فایلهای JSON کوچک، میتوانید از نیاز برای خواندن همزمان آنها استفاده کنید. این روش به طور خودکار فایل های JSON را در اشیاء جاوا اسکریپت تجزیه می کند. برای فایل های JSON بزرگتر و در سناریوهای غیر مسدود، از fs.readFile برای خواندن ناهمزمان آنها استفاده کنید. علاوه بر این، با استفاده از نیاز، محتویات فایل را در حافظه نهان می کند، بنابراین اگر فایل JSON شما تغییرات زیادی داشته باشد، ممکن است ایده آل نباشد.
نوشتن فایل های JSON با ماژول fs
با استفاده از روش writeFile می توانید داده ها را در فایل های JSON بنویسید. این روش سه آرگومان می گیرد:
- یک مسیر فایل
- داده هایی که می خواهید در فایل بنویسید، که می تواند یک رشته، یک بافر، یک AsyncIterable یا یک شی Iterable باشد.
- یک شی پیکربندی اختیاری.
این روش داده ها را به صورت ناهمزمان در یک فایل می نویسد. اگر فایل وجود داشته باشد، محتوای موجود را با محتوای جدید بازنویسی می کند. اگر فایل وجود نداشته باشد، آن را ایجاد می کند و با داده هایی که به عنوان آرگومان ارسال می کنید، آن را پر می کند.
مثلا:
const fakeUsers = [
{
id: 1,
name: "John Doe",
username: "johndoe123",
address: {
street: "123 Main St",
city: "Anytown",
},
},
{
id: 2,
name: "Jane Smith",
username: "janesmith456",
address: {
street: "456 Elm St",
city: "Another City",
},
}
];
fs.writeFile("./users.json", JSON.stringify(fakeUsers), {
encoding: "utf-8",
flag: "w",
}).catch((error) => {
console.error('Error writing the JSON file:', error);
});
دادههایی که به تابع writeFile ارسال میکنید باید یک رشته یا یک بافر باشند، بنابراین اگر میخواهید یک شی در فایل بنویسید، ابتدا باید آن را با استفاده از روش JSON.stringify به رشته تبدیل کنید.
به روز رسانی فایل های JSON با ماژول fs
ماژول fs راه صریحی برای بهروزرسانی فایلها ارائه نمیکند، زیرا نوشتن یک فایل، دادههای موجود را بازنویسی میکند.
برای حل این مشکل، میتوانید ابتدا یک فایل را با دریافت محتوای موجود از فایل با استفاده از روش readFile بهروزرسانی کنید. سپس، می توانید داده های موجود را به داده های فعلی خود اضافه کنید و آن را به عنوان آرگومان داده خود در متد writeFile ارسال کنید.
در اینجا تابعی است که منطق بالا را پیاده سازی می کند:
const updateFile = async (filePath, data) => {
try {
const fileContents = await fs.readFile(filePath, {
encoding: "utf-8",
flag: "r",
});
const fileData = JSON.parse(fileContents);
const updatedFileData = [...fileData, ...data];
await fs.writeFile(filePath, JSON.stringify(updatedFileData), {
encoding: "utf-8",
flag: "w",
});
return "File updated successfully";
} catch (error) {
console.error('Error updating the JSON file:', error);
}
};
می توانید تابع را به این صورت فراخوانی کنید:
updateFile("./users.json", [
{
id: 4,
name: "Jane Doe",
username: "janedoe123",
address: {
street: "123 Main St",
city: "Anytown",
},
},
{
id: 5,
name: "John Smith",
username: "johnsmith456",
address: {
street: "456 Elm St",
city: "Another City",
},
}
]).then((message) => {
console.log(message);
});
این بلوک کد کاربران با اطلاعات بالا را به فایل users.json موجود اضافه می کند.
ملاحظات امنیتی برای خواندن و نوشتن فایل های JSON
حفاظت از برنامه Node.js هنگام خواندن و نوشتن فایلهای JSON شامل ملاحظات امنیتی مهمی است. همیشه باید دادههای JSON را تأیید کنید تا مطمئن شوید که با انتظارات شما مطابقت دارد. همچنین باید مجوزهای دسترسی به فایل را محدود کنید و ورودی کاربر را برای جلوگیری از آسیبپذیریهای احتمالی مانند تزریق کد، پاکسازی کنید.