NodeJS: Error-First Callback
NodeJS
Aldimhr • 10-07-2025 • 3 min read
Pola Error-First Callback umum digunakan di NodeJS untuk menangani asynchronous operation, karena memudahkan penanganan error dengan cara yang konsisten. Dengan meletakkan error sebagai parameter pertama, kita bisa memisahkan logic utama dan error.
Callback
Callback merupakan function yang diberikan sebagai argumen untuk dijalankan setelah suatu proses selesai.
// Define func with callback
function getImage(path, callback){
// ... proses lain
callback(); // run callback function
}
// Define callback func
function callbackFunc(){
console.log('inside callback func');
}
// Call getImage func
getImage('./path/', callbackFunc);
Dari kode diatas kita menyimpan function dalam bentuk argumen callback
, lalu memanggilnya di parent function getImage
setelah proses lain dijalankan.
Error-First Callback
Error-First callback merupakan style atau gaya penulisan function callback di NodeJS dimana function memiliki dua argumen, error
untuk menampung error message ketika ada kesalahan selama proses dijalankan dan data
untuk menampung hasil dari proses yang dijalankan.
Contoh ketika kita ingin membaca isi file menggunakan fs
import fs from 'fs';
const errorFirstCallback = (err, data) => {
if(err) return err;
console.log('Data sukses diambil');
}
fs.readFile('./text.txt', errorFirstCallback);
Kode diatas kita definisikan callback function dalam variabel errorFirstCallback
dengan dua argumen, yaitu err
dan data
, lalu memanggil callback function di fs.readFile()
. Tapi, kebanyakan orang tidak akan menampung callback function dalam variabel terpisah, kalo kata Greg Wilson ini tidak efektif karena function hanya digunakan sekali.
import fs from 'fs';
fs.readFile('./text.txt', (err, data) => {
if(err) return err;
console.log('Data sukses diambil');
})
Di dalam callback function ada penjagaan menggunakan conditional if
, jadi ketika terjadi error akan langsung return value dari error, tanpa execute kode dibawahnya. Begitu sebaliknya, ketika condition if
tidak terpenuhi maka err
tidak pernah digunakan dan langsung execute kode dibawahnya.
Pattern
Saya menemukan pola menarik dan umum digunakan dimana callback dipanggil dari dua jalur terpisah: satu saat sukses dan satu saat error.
Contoh, ketika kita ingin menambahkan element <script>
ke dalam HTML.
function loadScript(src){
let script = document.createElement('script');
script.src = src;
document.head.append(script);
}
Function diatas akan menambahkan element <script>
didalam element <head>
pada HTML, nah masalahnya adalah ketika kita ingin menggunakan langsung kode didalam script yang kita muat dibawah function loadScript
, ini akan error karena loadScript
akan dieksekusi secara asynchronous.
loadScript('../script.js');
helloWorld(); // akan terjadi error karena function helloWorld belum tersedia; script belum selesai dimuat.
Sebelum menggunakan kode yang akan dimuat, kita harus pastiin dulu script berhasil dimuat, setelahnya kita bisa gunakan kode didalamnya. Bisa kita atasi dengan menambahkan script.onload
dan kita perlu callback function juga untuk menjalankan kode setelah berhasil dimuat.
function loadScript(src, callback){
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(script);
document.head.append(script);
}
Error Handling
Kode diatas belum mengatasi ketika ada error, ini bisa ditampung dalam script.onerror
, sehingga jika kita tambahkan menjadi
function loadScript(src, callback){
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(null, script);
script.onerror = () => callback(new Error('script load error'));
document.head.append(script);
}
Kode diatas ada perubahan di script.onload
, callback function menerima dua parameter yaitu null
sebagai placeholder untuk error dan script
sebagai placeholder hasil datanya, sedangkan di script.onerror
hanya memiliki satu parameter berisi error message. Penambahan parameter null
karena konsep Error-First callback tadi, callback function menerima error di parameter pertama.
Sekarang kita lihat bagaimana pemanggilan function loadScript
dan callback dibuat
loadScript('./script.js', (err, data) => {
if(err) return err;
helloWorld(); // berhasil karena script sudah loaded sebelum pemanggilan function
});
Saat melakukan pemanggilan loadScript
di dalam callback function terdapat conditional if
ini berguna ketika callback dipanggil di script.onload
dan script.onerror
.
Pertama case script.onload
, di dalam callback function akan melihat value dari error, dimana terisi null
di script.onload
sehingga kondisi ini tidak akan pernah true saat dipanggil, dan kode setelahnya akan selalu dijalankan.
Kedua case script.onerror
, di dalam callback function akan melihat value dari error, ini akan memenuhi kondisi if
maka kode setelah return err;
tidak akan pernah dijalankan.
Jadi, dengan Error-First Callback kita bisa memisahkan penanganan error dan logika utama. Kita juga bisa menggunakan callback lebih dari sekali dalam satu function yang sama. onload
akan menggunakan parameter keduanya saja sedangkan onerror
hanya menggunakan parameter pertamanya saja.
- JavaScript
- NodeJS