Contents

วิธีอ่านและเขียนไฟล์ JSON ใน Node.js

คุณสามารถอ่านและเขียนไฟล์ JSON ใน Node.js ได้ สิ่งที่คุณต้องทำคือใช้โมดูล fs ตามรายละเอียดในคำแนะนำที่ปฏิบัติตามง่ายของเรา

การอ่านและการเขียนไฟล์ JSON ใน Node.js

JavaScript Object Notation (JSON) เป็นมาตรฐานการถ่ายโอนข้อมูลที่แพร่หลายอย่างมาก โดยเฉพาะอย่างยิ่งมีชื่อเสียงในด้านความสามารถในการแสดงข้อมูลที่จัดระเบียบในลักษณะที่กระชับ รูปแบบนี้ซึ่งมีลักษณะเฉพาะโดยธรรมชาติของข้อความ ช่วยให้ผู้ใช้ที่เป็นมนุษย์เข้าใจได้ง่าย ขณะเดียวกันก็ช่วยให้แยกวิเคราะห์และสร้างได้อย่างราบรื่นโดยระบบประมวลผลของเครื่องจักร

การใช้ความสามารถในการแยกวิเคราะห์อัตโนมัติและการสร้างข้อมูล JSON ใน Node.js ช่วยให้การจัดเก็บ การส่ง และการจัดการข้อมูลที่มีโครงสร้างมีประสิทธิภาพและง่ายดาย รับความเข้าใจที่ครอบคลุมเกี่ยวกับการอ่าน การเขียน และการแก้ไขไฟล์ JSON ผ่านการใช้ประโยชน์จากส่วนประกอบระบบไฟล์ Node.js

โมดูลระบบไฟล์ Node.js

โมดูลระบบไฟล์ Node.js ซึ่งรวมอยู่ในสภาพแวดล้อม Node.js ทำให้ผู้ใช้สามารถสื่อสารกับระบบไฟล์ของอุปกรณ์ผ่านฟังก์ชันต่างๆ เช่น การอ่านไฟล์ การสร้างไฟล์ใหม่ และการลบไฟล์ และอื่นๆ อีกมากมาย

ฟังก์ชันการทำงานที่นำเสนอโดยโมดูลระบบไฟล์มีให้เลือกสองรูปแบบที่แตกต่างกัน อาจดำเนินการแบบอะซิงโครนัสหรือซิงโครนัสก็ได้ การดำเนินการแบบอะซิงโครนัสไม่ขัดขวางความก้าวหน้าของแอปพลิเคชันของคุณ เนื่องจากอนุญาตให้มีการประมวลผลพร้อมกันกับงานอื่น ๆ วิธีการที่เป็นไปตามรูปแบบนี้โดยทั่วไปจะมีชื่อที่แสดงถึงลักษณะที่ไม่ตรงกัน ตัวอย่างเช่น เราจะพบการกำหนด เช่น “Async” หรือ “await” ต่อท้ายชื่อวิธีการ เช่น readFileAsync หรือ writeFileAsync

ในขณะที่วิธีการซิงโครนัสระงับการทำงานของโปรแกรมจนกว่าการดำเนินการของระบบไฟล์จะเสร็จสิ้น วิธีการแบบอะซิงโครนัสอนุญาตให้โปรแกรมดำเนินการกับงานอื่น ๆ ไปพร้อม ๆ กันโดยใช้ฟังก์ชันโทรกลับที่ดำเนินการเมื่อสิ้นสุดการดำเนินการ ตัวอย่างภาพประกอบประกอบด้วยฟังก์ชัน readFile และ writeFile

เพื่อรักษาคุณลักษณะที่ไม่ปิดกั้นของลูปเหตุการณ์และเพิ่มประสิทธิภาพโดยรวมและความรวดเร็วของแอปพลิเคชันเมื่อจัดการกับไฟล์ จึงจำเป็นต้องใช้เทคนิคอะซิงโครนัสในการโต้ตอบทั้งหมดกับระบบไฟล์

ในกรณีเฉพาะที่ความเรียบง่ายเป็นสิ่งสำคัญยิ่งและการดำเนินการไม่บ่อยนัก เช่น สำหรับงานเขียนสคริปต์พื้นฐานหรือการจัดการไฟล์แบบใช้ครั้งเดียว วิธีการแบบอะซิงโครนัสอาจไม่จำเป็น และเทคนิคแบบซิงโครนัสสามารถพิสูจน์ได้ว่าเป็นโซลูชันที่มีประสิทธิภาพ

อ่านไฟล์ JSON ด้วยโมดูล fs

ในการประมวลผลไฟล์ JSON โดยใช้ JavaScript แบบอะซิงโครนัส จำเป็นต้องนำเข้าโมดูลระบบไฟล์แบบอะซิงโครนัสลงในไฟล์สคริปต์หลัก ซึ่งสามารถทำได้โดยการรวมคำสั่งนำเข้าไว้ที่จุดเริ่มต้นของไฟล์ ดังที่แสดงด้านล่าง:

 const fs = require("node:fs/promises");

หากใช้ Node.js รุ่นก่อนหน้าเวอร์ชัน 18 เราจะต้องนำเข้าโมดูล fs ในลักษณะดังต่อไปนี้:

 const fs = require("fs/promises");

หากต้องการนำเข้าโมดูลที่สมบูรณ์ รวมถึงส่วนประกอบทั้งแบบซิงโครนัสและอะซิงโครนัส จำเป็นต้องละ"/promises"ออกจากคำสั่งนำเข้า

การใช้ฟังก์ชัน readFile อาจอ่านเนื้อหาของไฟล์ JSON โดยระบุทั้งเส้นทางไดเร็กทอรีและออบเจ็กต์การกำหนดค่าเสริมเป็นพารามิเตอร์ ออบเจ็กต์การกำหนดค่านี้อาจเป็นออบเจ็กต์ JavaScript ที่มีค่ากำหนดการอ่านต่างๆ หรือสตริงที่ห่อหุ้มรูปแบบการเข้ารหัสที่กำหนดไว้ล่วงหน้า

ตัวเลือกออบเจ็กต์ประกอบด้วย:

พารามิเตอร์ที่ระบุจะกำหนดชุดอักขระที่ใช้ในระหว่างกระบวนการอ่านเอกสารใดเอกสารหนึ่ง โดยมีการกำหนดค่ามาตรฐานเป็น"utf8"ซึ่งโดยทั่วไปใช้สำหรับเนื้อหาที่เป็นข้อความ และ"ไบนารี"ที่ใช้กับไฟล์ข้อมูลที่ไม่ใช่ข้อความ

เครื่องหมายดอกจัน (*) ตามด้วยวงเล็บซึ่งอยู่ภายในวงเล็บปีกกา ({}) บ่งชี้ถึงอาร์กิวเมนต์ทางเลือกที่มีค่าเริ่มต้นเป็นค่า"r"ซึ่งหมายถึงโหมดการอ่านเมื่อเปิดไฟล์ในระบบไฟล์เฉพาะ โหมดการเข้าถึงไฟล์ทั่วไปอื่นๆ ได้แก่ “w” สำหรับโหมดเขียนอย่างเดียว และ “a” สำหรับโหมดผนวก

ตัวอย่างเช่น:

 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);
  });

แอปพลิเคชันในปัจจุบันได้รับการออกแบบมาเพื่อประมวลผลข้อมูลที่จัดเก็บไว้ในไฟล์ชื่อ “users.json” ซึ่งตั้งอยู่ใกล้กับจุดเรียกใช้งานของซอฟต์แวร์ เพื่อที่จะแยกเนื้อหาของไฟล์นี้โดยเฉพาะ เราสามารถใช้ฟังก์ชันการทำงานในตัวที่มาจากภาษาการเขียนโปรแกรมที่ใช้อยู่ โดยเฉพาะวิธีการที่เรียกว่า"JSON.parse"สามารถเรียกใช้กับข้อมูลที่ดึงมาเพื่อแปลงเป็นวัตถุ JavaScript การทำเช่นนี้จะทำให้ผู้ใช้สามารถโต้ตอบและแก้ไขข้อมูลที่มีอยู่ในนั้นได้ ทั้งหมดนี้อยู่ภายในขอบเขตของโค้ดเบสของพวกเขา

เมื่อต้องจัดการกับไฟล์ JSON ที่มีขนาดเล็ก อาจใช้ฟังก์ชัน require เพื่อแยกวิเคราะห์ไฟล์ดังกล่าวพร้อมกันและแปลงเนื้อหาเป็นอ็อบเจ็กต์ JavaScript อย่างไรก็ตาม สำหรับไฟล์ JSON ที่สำคัญกว่าหรือเมื่อทำงานภายในบริบทอะซิงโครนัส ขอแนะนำให้ใช้เมธอด fs.readFile แทน สิ่งสำคัญที่ควรทราบคือแนวทาง require มีศักยภาพในการแคชเนื้อหาทั้งหมดของไฟล์ภายในหน่วยความจำ ซึ่งอาจส่งผลให้เกิดปัญหาหากข้อมูล JSON มีการเปลี่ยนแปลงบ่อยครั้ง

การเขียนไฟล์ JSON ด้วยโมดูล fs

ฟังก์ชัน writeFile ช่วยให้สามารถสร้างและเขียนข้อมูลในรูปแบบ JSON ได้โดยระบุพารามิเตอร์ 3 ตัว ได้แก่ เส้นทางของไฟล์ ข้อมูลที่จะเขียน และฟังก์ชันเรียกกลับเสริม

⭐เส้นทางไฟล์

ข้อมูลที่มีไว้สำหรับการจัดเก็บในไฟล์อาจมีรูปแบบต่างๆ เช่น สตริง บัฟเฟอร์ การทำซ้ำแบบอะซิงโครนัส หรืออ็อบเจ็กต์ที่สามารถทำซ้ำได้

⭐วัตถุการกำหนดค่าเสริม

วิธีการเฉพาะนี้ใช้การดำเนินการแบบอะซิงโครนัสเพื่อวัตถุประสงค์ในการเขียนข้อมูลไปยังไฟล์ที่ระบุ ในกรณีที่ไฟล์ดังกล่าวมีอยู่แล้ว เนื้อหาปัจจุบันของไฟล์จะถูกแทนที่ด้วยข้อมูลที่ให้มา ซึ่งจะมีผลแทนที่ข้อมูลก่อนหน้านี้ที่อาจเก็บไว้ภายในไฟล์นั้นอย่างมีประสิทธิภาพ ในทางกลับกัน ในกรณีที่ยังไม่มีไฟล์ เทคนิคนี้จะสร้างไฟล์ขึ้นมาและเติมข้อมูลลงในไฟล์ที่ส่งเป็นอินพุตในภายหลัง ดังนั้นจึงมั่นใจได้ว่าข้อมูลที่จำเป็นทั้งหมดจะได้รับการบันทึกภายในตำแหน่งจัดเก็บข้อมูลที่กำหนดได้สำเร็จ

ตัวอย่างเช่น:

 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);
});

สตริงหรือบัฟเฟอร์ หากต้องการบันทึกวัตถุภายในไฟล์ดังกล่าว จำเป็นต้องแปลงเป็นสตริงโดยใช้วิธี JSON.stringify ล่วงหน้า

การอัปเดตไฟล์ JSON ด้วยโมดูล fs

รหัสที่ให้มาไม่มีวิธีการแก้ไขไฟล์โดยตรง เนื่องจากการเขียนลงในไฟล์จะลบเนื้อหาก่อนหน้าของไฟล์

เพื่อเอาชนะความท้าทายนี้ วิธีหนึ่งคือการดึงเนื้อหาที่มีอยู่ของไฟล์โดยใช้ฟังก์ชัน readFile ต่อจากนั้น เราอาจเชื่อมข้อมูลที่อัปเดตเข้ากับข้อมูลที่ดึงมา และจัดหาชุดข้อมูลทั้งสองเป็นอินพุตสำหรับการดำเนินการ writeFile

แน่นอนว่านี่คือตัวอย่างฟังก์ชันใน Python ที่รวบรวมตรรกะที่ระบุไว้:

 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);
});

ข้อมูลโค้ดนี้จะเพิ่มรายละเอียดของผู้ใช้ดังกล่าวต่อท้ายไฟล์ JSON ที่มีอยู่ที่เรียกว่า"users.json"

ข้อควรพิจารณาด้านความปลอดภัยสำหรับการอ่านและการเขียนไฟล์ JSON

การรับรองความปลอดภัยของแอปพลิเคชัน Node.js ที่จัดการไฟล์ JSON เป็นสิ่งสำคัญยิ่ง เนื่องจากการดำเนินการดังกล่าวเกี่ยวข้องกับแง่มุมที่สำคัญของการป้องกัน จำเป็นต้องตรวจสอบความถูกต้องของข้อมูล JSON เพื่อรับประกันการปฏิบัติตามข้อกำหนดที่กำหนดไว้ล่วงหน้า นอกจากนี้ การจำกัดสิทธิ์การเข้าถึงไฟล์และการล้างอินพุตของผู้ใช้เป็นมาตรการที่มีประสิทธิภาพในการต่อต้านภัยคุกคามที่อาจเกิดขึ้น เช่น การโจมตีด้วยการแทรกโค้ด