fs Asinkron: Callback & fs/promises
Membaca dan menulis berkas tanpa memblokir event loop memakai fs/promises dan async/await.
Kenapa asinkron untuk server?
readFileSync membuat seluruh proses diam sampai disk selesai membaca. Di server dengan 1000 pengguna, satu pembacaan lambat membuat semuanya menunggu. Versi asinkron menyerahkan pekerjaan ke sistem dan membiarkan event loop melayani yang lain.
fs/promises: pilihan modern
const fs = require('fs/promises'); // atau: import fs from 'node:fs/promises'
async function main() {
await fs.writeFile('log.txt', 'mulai\n');
await fs.appendFile('log.txt', 'lanjut\n');
const isi = await fs.readFile('log.txt', 'utf8');
console.log(isi);
const nama = await fs.readdir('.');
const info = await fs.stat('log.txt');
console.log(nama, info.size);
}
main();
Nama dan argumennya sama dengan versi sinkron, tetapi tanpa akhiran Sync dan mengembalikan Promise.
Menangani error dengan try/catch
async function baca(berkas) {
try {
return await fs.readFile(berkas, 'utf8');
} catch (err) {
if (err.code === 'ENOENT') return null; // anggap tidak ada = kosong
throw err;
}
}
Versi callback
const fs = require('fs');
fs.readFile('log.txt', 'utf8', (err, isi) => {
if (err) return console.error(err.message);
console.log(isi);
});
Masih sering dijumpai di kode lama; konsepnya sama dengan bab callback.
Banyak berkas sekaligus
const nama = ['a.txt', 'b.txt', 'c.txt'];
const isi = await Promise.all(nama.map((n) => fs.readFile(n, 'utf8'))); // paralel
Pola: memuat JSON konfigurasi
async function muatJson(berkas, bawaan = {}) {
try {
return JSON.parse(await fs.readFile(berkas, 'utf8'));
} catch (err) {
if (err.code === 'ENOENT') return bawaan; // berkas belum ada
throw err; // JSON rusak / izin ditolak
}
}
Penulisan aman
writeFilemenimpa berkas; jika proses mati di tengah, isi bisa rusak. Untuk data penting, tulis ke berkas sementara lalurename(atomik).- Jangan menjalankan banyak
writeFileke berkas yang sama bersamaan: urutannya tak terjamin. Gunakanawaitberurutan. - Selalu validasi jalur dari input pengguna agar tidak keluar dari folder yang diizinkan (path traversal, mis.
../../etc/passwd).
Mana yang dipakai?
| Situasi | Pilihan |
|---|---|
| Skrip sekali jalan, konfigurasi saat startup | Sinkron (sederhana) |
| Server / dipanggil per permintaan | fs/promises |
| Berkas sangat besar | Stream |