Kodokon kodokon.com

ระบบไฟล์: การอ่านและเขียนด้วย fs/promises

อ่านและเขียนไฟล์ด้วยโมดูล fs/promises และสร้างพาธที่เชื่อถือได้ด้วยโมดูล path

8 นาที · 3 คำถาม

เปิดบทเรียนนี้ใน Kodokon

ในเบราว์เซอร์ JavaScript ไม่ได้รับอนุญาตให้แตะต้องไฟล์บนดิสก์ของคุณ นั่นเป็นเรื่องของความปลอดภัย ในทางกลับกัน Node ทำงานบนเครื่องของคุณโดยตรง และสามารถอ่านและเขียนไฟล์ได้ด้วยโมดูล fs (file system) เราจะใช้เวอร์ชันสมัยใหม่ของมัน คือ fs/promises ซึ่งทุกฟังก์ชันของมันจะคืนค่าเป็น พรอมิส (promise) คุณรู้วิธีรอมันด้วย await อยู่แล้ว จากที่ได้เรียนในคอร์ส JavaScript สังเกตคำนำหน้า node: ในการ import มันทำให้ชัดเจนว่าโมดูลนี้มาจาก Node เอง ไม่ใช่จาก node_modules และข่าวดีคือ ในโมดูล ES await ทำงานได้โดยตรงในระดับไฟล์ โดยไม่ต้องมีฟังก์ชันครอบ

JAVASCRIPT
import { writeFile } from "node:fs/promises";

await writeFile("notes.txt", "First note\n");
console.log("File created!");
writeFile สร้างไฟล์ notes.txt หากมันยังไม่มีอยู่ ด้วยข้อความที่ให้ไว้เป็นพารามิเตอร์ตัวที่สอง

ในการอ่าน ใช้หลักการเดียวกันกับ readFile พารามิเตอร์ตัวที่สองของมันสำคัญมาก utf8 ระบุ การเข้ารหัส (encoding) หมายถึงวิธีการแปลไบต์ที่เก็บอยู่บนดิสก์ให้เป็นข้อความที่อ่านได้ หากคุณละเว้นมัน Node จะคืนค่าเป็นอ็อบเจกต์ Buffer ซึ่งเป็นไบต์ดิบ แทนที่จะเป็นสายอักขระ

JAVASCRIPT
import { readFile } from "node:fs/promises";

const text = await readFile("notes.txt", "utf8");
console.log(text);
เนื้อหาของไฟล์จะมาในรูปสายอักขระ พร้อมให้นำไปจัดการต่อ

มาพูดถึง พาธ (path) กัน พาธแบบ สัมพัทธ์ (relative) (notes.txt, data/log.txt) เริ่มจากโฟลเดอร์ปัจจุบัน ส่วนพาธแบบ สัมบูรณ์ (absolute) (C:\... หรือ /home/...) เริ่มจากรากของดิสก์ กับดักคลาสสิกคือ Windows คั่นโฟลเดอร์ด้วย \ ส่วน macOS และ Linux ใช้ / โมดูล path ช่วยแก้ปัญหานี้ path.join ประกอบชิ้นส่วนต่าง ๆ เข้าด้วยกันด้วยตัวคั่นที่ถูกต้อง ไม่ว่าจะเป็นระบบใดก็ตาม มาผสมมันกับ mkdir ซึ่งใช้สร้างโฟลเดอร์กัน

JAVASCRIPT
import path from "node:path";
import { mkdir, writeFile } from "node:fs/promises";

const file = path.join("data", "log.txt");

await mkdir("data", { recursive: true });
await writeFile(file, "First log\n");
console.log("Written to:", file);
ตัวเลือก recursive ช่วยหลีกเลี่ยงข้อผิดพลาดหากโฟลเดอร์ data มีอยู่แล้ว

ทดสอบความรู้

ตรวจสอบว่าคุณจำประเด็นสำคัญของบทเรียนนี้ได้ครบถ้วน

  1. readFile จะคืนค่าอะไรหากคุณละเว้นพารามิเตอร์ตัวที่สอง utf8?
    • สายอักขระว่าง
    • ข้อผิดพลาด เพราะการเข้ารหัสเป็นสิ่งที่บังคับ
    • Buffer ซึ่งก็คือไบต์ดิบของไฟล์
  2. writeFile ทำอะไรหากไฟล์เป้าหมายมีอยู่แล้ว?
    • มันแทนที่เนื้อหาเดิมทั้งหมดด้วยข้อความใหม่
    • มันเพิ่มข้อความใหม่ที่ท้ายไฟล์
    • มันปฏิเสธที่จะเขียนและแจ้งข้อผิดพลาด
    • มันสร้างสำเนาสำรองโดยอัตโนมัติ
  3. path.join มีประโยชน์อย่างไรในการสร้างพาธ?
    • มันสร้างโฟลเดอร์ที่ขาดหายไปของพาธ
    • มันประกอบชิ้นส่วนต่าง ๆ เข้าด้วยกันด้วยตัวคั่นที่ถูกต้องสำหรับระบบนั้น
    • มันตรวจสอบว่าไฟล์มีอยู่จริงก่อนดำเนินการต่อ