fs Asinkron: Callback & fs/promises

Membaca dan menulis berkas tanpa memblokir event loop memakai fs/promises dan async/await.

Part 12 dari 24 ± 35 menit Gratis

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

  • writeFile menimpa berkas; jika proses mati di tengah, isi bisa rusak. Untuk data penting, tulis ke berkas sementara lalu rename (atomik).
  • Jangan menjalankan banyak writeFile ke berkas yang sama bersamaan: urutannya tak terjamin. Gunakan await berurutan.
  • Selalu validasi jalur dari input pengguna agar tidak keluar dari folder yang diizinkan (path traversal, mis. ../../etc/passwd).

Mana yang dipakai?

SituasiPilihan
Skrip sekali jalan, konfigurasi saat startupSinkron (sederhana)
Server / dipanggil per permintaanfs/promises
Berkas sangat besarStream

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X