Membaca adalah operasi filesystem yang paling sering kita jalankan: memuat konfigurasi, mengimpor data, sampai menampilkan isi template semuanya dimulai dari satu operasi baca. Node.js menyediakan satu pintu utama untuk kebutuhan itu, yaitu readFile dari node:fs/promises. Hasil pembacaan bisa berupa string teks maupun data biner mentah bergantung satu hal kecil: encoding yang kita berikan. Pada chapter ini kita bedah kedua bentuk hasil tersebut beserta pola pemakaian yang paling umum, termasuk membaca berkas JSON.
Membaca Berkas Teks #
readFile menerima path berkas sebagai argumen pertama dan encoding sebagai argumen kedua. Ketika encoding "utf8" disertakan, hasil operasi adalah string yang siap dipakai — tidak perlu konversi tambahan. Tanpa encoding, hasilnya berupa Buffer, yang akan kita bahas di bagian berikutnya.
import { readFile } from "node:fs/promises";
const isi = await readFile("catatan.txt", "utf8");
const baris = isi.trim().split("\n");
console.log(`jumlah baris: ${baris.length}`);
for (const [indeks, teks] of baris.entries()) {
console.log(`${indeks + 1}. ${teks}`);
}Output yang Dihasilkan:
jumlah baris: 4
1. Daftar belanja mingguan:
2. - Beras 5 kg
3. - Gula 1 kg
4. - Kopi bubuk 250 gramMari kita telaah baris-baris kode di atas:
- Baris 3 (
await readFile(...)): seluruh isicatatan.txtdibaca sekaligus ke memori, lalu dikembalikan sebagai string berkat encoding"utf8". Berkas ini sudah disertakan di bundle chapter. - Baris 4 (
isi.trim().split("\n")):trim()membuang karakter baris baru di akhir berkas agar tidak menghasilkan elemen kosong, lalusplit("\n")memecah teks menjadi array per baris. - Baris 7-9 (perulangan):
baris.entries()memasangkan setiap elemen dengan indeksnya, sehingga kita bisa mencetak nomor baris tanpa penghitung manual.
Pola baca-lalu-olah seperti ini adalah kerangka dasar hampir semua pemrosesan berkas teks: pembacaan CSV sederhana, penghitungan kata, sampai parsing log yang ringan.
Hasil Tanpa Encoding: Buffer #
Apa yang terjadi jika argumen encoding dihilangkan? Hasil readFile menjadi object Buffer: urutan byte mentah persis seperti tersimpan di disk. Bentuk ini penting untuk berkas biner — gambar, arsip, berkas terkompresi — yang tidak punya makna sebagai teks.
import { readFile } from "node:fs/promises";
const buffer = await readFile("sapaan.txt");
console.log(`tipe data : ${buffer.constructor.name}`);
console.log(`ukuran : ${buffer.length} byte`);
console.log(`heksa : ${buffer.toString("hex").slice(0, 12)}`);
console.log(`potongan : ${buffer.subarray(0, 4).toString("utf8")}`);
console.log(`lengkap : ${buffer.toString("utf8")}`);Output yang Dihasilkan:
tipe data : Buffer
ukuran : 14 byte
heksa : 48616c6f2c20
potongan : Halo
lengkap : Halo, Node.js!Mari kita telaah baris-baris kode di atas:
- Baris 3 (tanpa encoding):
readFilemengembalikanBuffer, sehinggabuffer.constructor.namebernilai"Buffer". Ukurannya dihitung dalam byte, bukan jumlah karakter — dua ukuran yang bisa berbeda untuk teks non-ASCII. - Baris 7 (
toString("hex")): setiap byte direpresentasikan sebagai dua digit heksadesimal, misalnya48untuk hurufH. Cuplikanslice(0, 12)mengambil enam byte pertama agar output tetap ringkas. - Baris 8 (
subarray(0, 4)):subarraymengambil potongan buffer tanpa menyalin datanya; potongan lalu diterjemahkan menjadi teks dengan encoding yang jelas.subarrayberbagi memori dengan buffer asal, jadi mengubah potongan juga mengubah buffer aslinya. - Baris 9 (
toString("utf8")): karenasapaan.txtmemang berisi teks, seluruh buffer dapat diterjemahkan kembali menjadi string utuh.
Membaca Berkas JSON #
Format JSON adalah bahasa pertukaran data paling umum: konfigurasi, hasil ekspor, hingga respons API sering dikemas dalam bentuk ini. Kombinasi readFile dan JSON.parse mengubah berkas JSON menjadi object JavaScript yang bisa langsung diakses field-nya.
import { readFile } from "node:fs/promises";
const mentah = await readFile("data.json", "utf8");
const data = JSON.parse(mentah);
console.log(`Aplikasi : ${data.namaAplikasi} v${data.versi}`);
console.log(`Penulis : ${data.penulis.nama} (${data.penulis.email})`);
console.log(`Fitur : ${data.fitur.join(", ")}`);Output yang Dihasilkan:
Aplikasi : Catatan Harian v2
Penulis : Dewi ([email protected])
Fitur : tema-gelap, ekspor-json, penanda-bintangAlurnya dua langkah: readFile menghasilkan string mentah, lalu JSON.parse
menerjemahkan string tersebut menjadi object. Setelah itu data.penulis.nama atau data.fitur diakses seperti object JavaScript mana pun — karena memang menjadi object JavaScript sungguhan. Berbeda dengan import module, pembacaan seperti ini berjalan saat program dieksekusi, sehingga path bisa dipilih secara dinamis dan berkas boleh berganti isi tanpa mengubah kode.
Encoding yang Tepat untuk Kebutuhan yang Tepat #
Kita sudah melihat dua encoding berbeda dalam satu chapter: "utf8" untuk teks dan "hex" untuk menampilkan byte. Pilihan encoding menentukan bentuk data yang kita terima, bukan isi berkasnya. Untuk pekerjaan sehari-hari, "utf8" adalah pilihan aman karena mencakup seluruh karakter Unicode termasuk bahasa Indonesia. Encoding lain seperti "base64" berguna saat kita perlu menyisipkan data biner ke dalam teks, misalnya pada lampiran email atau data URI. Rincian encoding yang didukung Node.js dirangkum pada dokumentasi Buffer
, sedangkan rujukan readFile lengkap dengan seluruh opsinya ada di dokumentasi fs
.
Membaca setengah dari cerita filesystem; separuh lainnya adalah menyimpan hasil olahan kembali ke disk. Chapter berikutnya, Menulis Berkas, membahas writeFile, appendFile, dan flag yang mengatur bagaimana data diletakkan ke dalam berkas.