การเขียนข้อมูลลงบนไฟล์ใน Node.js

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

  • การเขียนข้อมูลลงบนไฟล์ใน Node.js
  • การเขียนข้อมูลลงบนไฟล์แบบ Synchronous
  • การเขียนข้อมูลต่อท้ายไฟล์เดิม (Append)

ในบทนี้เราจะพูดถึงการทำงานกับ Text ไฟล์และไม่ได้ครอบคลุมถึงการทำงานกับ Binary ไฟล์

การเขียนข้อมูลลงบนไฟล์ใน Node.js

Node.js มีเมธอดสองรูปแบบสำหรับเขียนไฟล์นั้นคือเมธอดที่มีการทำงานแบบ Asynchronous และ Synchronous ในรูปแบบแรกเป็นการเขียนไฟล์ที่ไม่บล็อคการทำงานของโปรแกรม นั่นหมายความว่าในขณะที่ไฟล์เขียนยังไม่เสร็จโปรแกรมสามารถทำงานอย่างอื่นไปพร้อมกันได้ ซึ่งนี่เป็นรูปแบบการทำงานพื้นฐานของการเขียนโปรแกรมบน Node.js ส่วนแบบที่สองเป็นการทำงานที่จะบล็อคจนกว่าการเขียนไฟล์จะเสร็จสิ้น

การเขียนข้อมูลลงไฟล์บน Node.js นั้นสามารถทำได้ง่ายๆ โดยการใช้เมธอดจากโมดูล fs นี่เป็นตัวอย่างการเขียนข้อมูลลงบนไฟล์ myfile.txt

write_file.js
const fs = require('fs');

let content = 'This is a first line\n';
content += 'This is a second line\n';
content += 'This is a third line\n';

fs.writeFile('./myfile.txt', content, (err) => {
    if (err) {
        console.error(err)
        return
    }
    console.log('File written successfully.');
});

นี่เป็นผลลลัพธ์การทำงานของโปรแกรม

File written successfully.

ในตัวอย่างนี้ เราได้เขียนข้อมูลลงบน Text ไฟล์โดยใช้เมธอด writeFile จากโมดูล fs เพื่อเริ่มต้นใช้งานเมธอดเรานำเข้าโมดูลด้วยคำสั่ง

const fs = require('fs');

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

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

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

นี่เป็นผลลัพธ์ในไฟล์ myfile.txt ที่ถูกสร้างขึ้นจากการรันโปรแกรม จะเห็นว่าข้อความในตัวแปรได้ถูกเขียนลงไปบนไฟล์ได้อย่างถูกต้อง

myfile.txt
This is a first line
This is a second line
This is a third line

การเขียนข้อมูลลงบนไฟล์แบบ Synchronous

Node.js มีเมธอดสำหรับการเขียนไฟล์ในรูปแบบ Synchronous ซึ่งการทำงานของมันจะบล็อกการทำงานของโปรแกรม (ฺBlocking I/O) จนกว่าการเขียนไฟล์จะเสร็จสิ้น นี่เป็นเมธอดที่คุณจะต้องใช้เมื่อต้องการให้โปรแกรมทำงานอย่างเป็นลำดับหรือต้องการการทำงานรูปแบบนี้โดยเฉพาะ

นี่เป็นตัวอย่างของการเขียนไฟล์โดยการใช้เมธอด writeFileSync ของ Node.js

write_file_sync.js
const fs = require('fs');

let content = 'This is a first line\n';
content += 'This is a second lline\n';
content += 'This is a third lline\n';

try {
    fs.writeFileSync('./myfile.txt', content);
} catch (err) {
    console.log(err);
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

File written successfully.

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

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

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

การเขียนข้อมูลต่อท้ายไฟล์เดิม (Append)

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

append_file.js
const fs = require('fs');

let content = `${new Date().toISOString()} Log message\n`;

fs.appendFile('./mylog.txt', content, (err) => {
    if (err) {
        console.error(err)
        return
    }
    console.log('File written successfully.');
});

จากนั้นเรารันโปรแกรมสองครั้ง นี่เป็นเนื้อหาในไฟล์ mylog.txt ที่ถูกสร้างขึ้น

mylog.txt
2021-03-01T23:51:21.249Z Log message
2021-03-01T23:51:22.042Z Log message

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

นอกจากนี้เมธอดยังมีเวอร์ชัน Synchronous นั่นคือ appendFileSync ที่เราสามารถใช้สำหรับเขียนข้อมูลต่อท้ายไฟล์ได้เช่นกัน นี่เป็นตัวอย่างการใช้งาน

append_file_sync.js
const fs = require('fs');

let content = `${new Date().toISOString()} Log message\n`;

try {
    fs.appendFileSync('./mylog.txt', content);
    console.log('File written successfully.');
} catch (err) {
    console.log(err);
}

ซึ่งจะได้ผลลัพธ์การทำงานเหมือนตัวอย่างการหน้า แต่โปรแกรมจะทำงานแบบบล็อคแทน

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการเขียนข้อมูลลงบน Text ไฟล์ใน Node.js เราได้พูดถึงการเขียนข้อมูลลงบนไฟล์ใหม่ และการเขียนข้อมูลต่อท้ายไฟล์เดิม และ Node.js มีเมธอดที่ทำงานในรูปแบบ Asynchronous และ Synchronous ให้สามารถใช้ได้