fs.writeFile(path, data, callback) menulis string atau Buffer ke sebuah file. Kalau file-nya belum ada, Node membuatnya; kalau sudah ada, isi lamanya diganti. fs.writeFileSync(path, data) melakukan hal yang sama dan menunggu sampai penulisan selesai, sedangkan fs.appendFile menambah di akhir file alih-alih menggantinya.
Hasilnya saved lalu teks yang dibaca kembali; callback hanya menerima error (atau null), tidak pernah datanya. Berikan 42 alih-alih string dan panggilannya melempar TypeError: datanya harus string atau Buffer.
writeFile, writeFileSync dan fs/promises
Ketiga bentuk ini menerima argumen yang sama dan berbeda dalam cara kamu menunggu hasilnya.
const fs = require('fs');
const fsp = require('fs/promises');
fs.writeFileSync('a.txt', 'one'); // blocks, throws on error
fs.writeFile('b.txt', 'two', (err) => {}); // callback with err
await fsp.writeFile('c.txt', 'three'); // promise, use in async code
Pakai writeFileSync di script dan kode startup, dan versi promise di server, karena penulisan sync memblokir setiap request lain sampai disk selesai. Halaman fs/promises menunjukkan sisa API promise-nya.
Menambah ke file dengan appendFile
writeFile mengganti seluruh file. Untuk menambah satu baris ke log, pakai appendFile, yang juga membuat file-nya saat pertama kali.
Pembacaan pertama mencetak "second\n", karena writeFileSync kedua menggantikan first, dan pembacaan kedua mencetak "second\nthird\nfourth\n" (JSON.stringify membuat newline-nya terlihat). Tambahkan \n sendiri: kedua fungsi tidak menambahkannya.
writeFile | appendFile | |
|---|---|---|
| File belum ada | Membuatnya | Membuatnya |
| File sudah ada | Mengganti isinya | Menambah di akhir |
| Flag default | 'w' | 'a' |
| Penggunaan umum | Menyimpan seluruh dokumen atau JSON | Log, satu baris setiap kali |
Jangan menimpa: opsi flag
Argumen ketiga bisa berupa object opsi. flag-nya menentukan apa yang terjadi pada file yang sudah ada. 'wx' berarti "tulis, tetapi gagal kalau file sudah ada", cara aman untuk membuat file hanya sekali.
Panggilan kedua gagal dengan EEXIST, jadi file-nya tetap berisi abc123. Ganti nama file di panggilan kedua menjadi id2.txt dan kedua panggilan mencetak created.
Flag yang paling sering kamu temui: 'w' (default, ganti), 'a' (append), 'wx' (hanya buat baru), dan 'ax' (append, tetapi hanya ke file baru).
Mengecek dengan fs.existsSync dulu lalu menulis punya celah: proses lain bisa membuat file di antara pengecekan dan penulisan. 'wx' melakukan keduanya dalam satu langkah.
Menulis JSON ke file
writeFile tidak menerima object. Ubah menjadi teks dengan JSON.stringify; argumen ketiganya, 2, memberi indentasi pada output supaya file-nya mudah dibaca.
File-nya berisi object itu dalam beberapa baris berindentasi, dan mem-parse-nya kembali menghasilkan object yang setara, jadi baris terakhir mencetak 2. Berikan object tanpa JSON.stringify dan panggilannya melempar TypeError.
Buat foldernya dulu dengan mkdir
writeFile membuat file, bukan folder. Menulis ke reports/2026/june.txt saat reports belum ada akan gagal dengan ENOENT. Buat path-nya dulu dengan mkdir dan { recursive: true }, yang membuat setiap folder yang belum ada dan tidak melakukan apa-apa kalau sudah ada.
Penulisan pertama gagal dengan ENOENT; setelah mkdir, penulisan yang sama berhasil dan readdir menampilkan [ 'june.txt' ]. Di kode sungguhan, susun path seperti ini dengan path.join supaya juga bekerja di Windows.
Kesalahan umum
Mengira file langsung tertulis setelah pemanggilan. fs.writeFile kembali sebelum datanya ada di disk. Baca file-nya atau mulai langkah berikutnya di dalam callback, atau await versi promise-nya.
Kehilangan data karena menulis di dalam perulangan. Memanggil writeFile sekali per item mengganti file setiap kali, sehingga hanya item terakhir yang tersisa. Pakai appendFile, atau susun seluruh string-nya lalu tulis sekali.
Menulis [object Object]. Melewatkan object lewat String() atau template literal menghasilkan [object Object]. Pakai JSON.stringify.
Pertanyaan yang sering diajukan
Apakah fs.writeFile menimpa file?
Ya. Dengan flag default 'w', fungsi ini mengosongkan file lalu menulis data baru, jadi isi lamanya hilang. Berikan { flag: 'a' } atau pakai appendFile untuk menambah di akhir.
Apakah fs.writeFile membuat file kalau belum ada?
Ya, file-nya dibuat. Tetapi folder yang belum ada tidak ikut dibuat: menulis ke logs/app.log saat logs tidak ada akan gagal dengan ENOENT.
Apa saja yang bisa diberikan sebagai data?
String, Buffer, atau typed array. Selain itu, seperti object atau angka, akan melempar TypeError, jadi ubah object dengan JSON.stringify dan angka dengan String() lebih dulu.
Amankah memanggil writeFile berkali-kali sekaligus pada file yang sama?
Tidak. Dua panggilan writeFile pada satu file secara paralel bisa saling menyela dan meninggalkan isi yang tercampur. Tunggu satu selesai sebelum memulai yang berikutnya, atau kumpulkan datanya lalu tulis sekali.