การเขียนข้อมูลลงบนไฟล์ใน Node.js
ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการเขียนข้อมูลลงบนไฟล์ใน Node.js โดยการใช้โมดูลมาตรฐาน fs
การเขียนไฟล์เป็นสิ่งที่พบได้ทั่วไปในการเขียนโปรแกรม เมื่อเราต้องการบันทึกข้อมูลจากหน่วยความจำลงบนดิสอย่างถาวร เราสามารถเขียนมันลงไปบนไฟล์ได้ และนี่เป็นเนื้อหาในบทนี้
- การเขียนข้อมูลลงบนไฟล์ใน Node.js
- การเขียนข้อมูลลงบนไฟล์แบบ Synchronous
- การเขียนข้อมูลต่อท้ายไฟล์เดิม (Append)
ในบทนี้เราจะพูดถึงการทำงานกับ Text ไฟล์และไม่ได้ครอบคลุมถึงการทำงานกับ Binary ไฟล์
การเขียนข้อมูลลงบนไฟล์ใน Node.js
Node.js มีเมธอดสองรูปแบบสำหรับเขียนไฟล์นั้นคือเมธอดที่มีการทำงานแบบ Asynchronous และ Synchronous ในรูปแบบแรกเป็นการเขียนไฟล์ที่ไม่บล็อคการทำงานของโปรแกรม นั่นหมายความว่าในขณะที่ไฟล์เขียนยังไม่เสร็จโปรแกรมสามารถทำงานอย่างอื่นไปพร้อมกันได้ ซึ่งนี่เป็นรูปแบบการทำงานพื้นฐานของการเขียนโปรแกรมบน Node.js ส่วนแบบที่สองเป็นการทำงานที่จะบล็อคจนกว่าการเขียนไฟล์จะเสร็จสิ้น
การเขียนข้อมูลลงไฟล์บน Node.js นั้นสามารถทำได้ง่ายๆ โดยการใช้เมธอดจากโมดูล fs
นี่เป็นตัวอย่างการเขียนข้อมูลลงบนไฟล์ myfile.txt
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
ที่ถูกสร้างขึ้นจากการรันโปรแกรม จะเห็นว่าข้อความในตัวแปรได้ถูกเขียนลงไปบนไฟล์ได้อย่างถูกต้อง
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
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
แทน นี่เป็นตัวอย่าง
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
ที่ถูกสร้างขึ้น
2021-03-01T23:51:21.249Z Log message
2021-03-01T23:51:22.042Z Log message
เมธอด appendFile
ใช้สำหรับเขียนข้อมูลต่อท้ายไฟล์เดิมหากไฟล์ดังกล่าวนั้นมีอยู่แล้ว ในกรณีที่ไม่มีไฟล์อยู่ มันจะสร้างไฟล์ใหม่และเขียนข้อมูลลงไปเหมือนกับเมธอด write
นอกจากนี้เมธอดยังมีเวอร์ชัน Synchronous นั่นคือ appendFileSync
ที่เราสามารถใช้สำหรับเขียนข้อมูลต่อท้ายไฟล์ได้เช่นกัน นี่เป็นตัวอย่างการใช้งาน
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 ให้สามารถใช้ได้