Aldimhr Home Page

NodeJS: Error-First Callback

NodeJS

Aldimhr • 10-07-2025 • 3 min read

NodeJS: Error-First Callback

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.