Tutorial Node JS 22: Bikin API Fitur Upload Photo dengan Busboy

Buat kamu yang ingin membangun website sewa rumah dari nol, memilih vanilla Node.js sebagai fondasi backend adalah keputusan yang tepat. Tanpa bantuan framework seperti Express, kamu jadi benar-benar paham cara kerja HTTP server, gimana request dan response diproses, dan bagaimana data bisa ditransfer lewat API. Ini penting banget terutama kalau kamu ingin bikin backend yang ringan, cepat, dan bisa disesuaikan penuh sesuai kebutuhan bisnis kamu.

Selain itu, vanilla Node.js juga cocok banget dipakai untuk proyek yang skalanya masih kecil sampai menengah. Kamu punya kontrol penuh terhadap routing, middlewaare, hingga pengolahan file. Jadi kalau nanti butuh scaling atau ingin migrasi ke arsitektur yang lebih besar, kamu sudah punya fondasi yang kuat.

Manfaat Utama Vanilla Node.js: Maintainable dan Scalable

Salah satu keuntungan paling jelas ketika membangun backend dengan vanilla Node.js adalah kemudahan untuk membuat struktur yang maintainable. Kamu bebas bikin arsitektur yang modular, misalnya pisahin logic per folder seperti controller, service, middleware, hingga utilitas umum. Karena enggak bergantung pada library pihak ketiga, kamu juga enggak perlu terlalu khawatir dengan masalah compatibility antar versi atau update mendadak.

Dari sisi scalability, Node.js dikenal sangat efisien dalam menangani banyak koneksi secara bersamaan karena sifatnya non-blocking dan event-driven. Bahkan tanpa Express, kamu tetap bisa membuat server yang siap menangani beban trafik tinggi, selama struktur kodenya dirancang dengan baik. Artinya, aplikasi kamu tetap jalan mulus walau pengguna bertambah banyak, apalagi kalau nanti didukung dengan deployment modern seperti Docker atau load balancer.

Fokus Artikel Ini: Upload Foto Menggunakan Busboy + Postman

Nah, di artikel ini kita bakal bahas salah satu fitur penting dalam proyek website sewa rumah: upload foto properti ke backend. Dalam dunia nyata, pemilik rumah pasti ingin tampilkan gambar rumah mereka supaya calon penyewa bisa lebih yakin sebelum booking. Karena itu, fitur upload foto bukan lagi tambahan, tapi sudah jadi fitur utama.

Kita akan menggunakan Busboy, yaitu library kecil di Node.js yang sangat efektif buat parsing form-data, terutama saat user mengirimkan file lewat HTTP POST. File foto yang dikirim akan kita simpan langsung ke file system dalam folder khusus, tanpa perlu database. Dan sebagai pengujian, kita akan pakai Postman untuk mencoba kirim file dan lihat apakah file-nya berhasil disimpan. Dari proses ini, kamu bisa belajar bagaimana backend menerima file, menyimpannya, dan memberikan respons yang sesuai.

Cara Install Node.js di Windows dan Membuat Proyek Pertama Backend API Sewa Rumah

Langkah pertama yang perlu kamu lakukan adalah menginstall Node.js di Windows. Silakan buka situs resmi https://nodejs.org, lalu pilih versi LTS (Long Term Support) dan klik download. Setelah file selesai diunduh, jalankan installer dan ikuti langkah-langkah instalasinya seperti biasa hingga selesai.

Setelah instalasi selesai, buka Command Prompt lalu ketik perintah berikut untuk memastikan bahwa Node.js dan npm sudah terpasang dengan benar:

node -v
npm -v

Jika muncul versi dari Node.js dan npm, artinya kamu sudah siap membuat project backend pertamamu.

Sekarang kita buat folder baru untuk proyek sewa rumah:

mkdir sewa-rumah-api
cd sewa-rumah-api

Inisialisasi project Node.js dengan perintah:

npm init -y

Setelah itu, buat file utama server dengan nama index.js:

// index.js

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({ message: 'API Sewa Rumaah berjalan lancar' }));
});

server.listen(3000, () => {
  console.log('Server berjalan di <http://localhost:3000>');
});

Lalu jalankan server dengan perintah berikut di terminal:

node index.js

Jika tidak ada error, maka akan muncul tulisan Server berjalan di http://localhost:3000. Itu artinya kamu sudah berhasil menjalankan server backend pertama kamu menggunakan vanilla Node.js, dan backend API sewa rumah siap kamu lanjutkan pengembangannya.

Struktur Folder Proyek Backend Sewa Rumah (Vanilla Node.js)

Untuk menjaga proyek tetap rapi, scalable, dan mudah dikembangkan, sangat disarankan membuat struktur folder yang jelas sejak awal. Walaupun kita tidak menggunakan framework seperti Express, bukan berarti kita menulis semua logic di satu file. Kita tetap bisa menyusun kode secara modular menggunakan pendekatan berikut.


Contoh Struktur Folder

sewa-rumah-api/
├── controllers/
│   └── house.controller.js
├── data/
│   └── houses.json
├── middlewares/
│   └── upload.middleware.js
├── models/
│   └── house.model.js
├── routes/
│   └── house.routes.js
├── schemas/
│   └── house.schema.js
├── services/
│   └── house.service.js
├── uploads/
│   └── (folder kosong untuk menyimpan file foto)
├── utils/
│   └── generate-id.js
├── index.js
├── package.json


Penjelasan Masing-Masing Folder

controllers/

Berisi file yang menangani request dari user dan mengatur response-nya. Contohnya house.controller.js untuk handle upload foto, mengambil daftar rumah, atau menambahkan rumah baru.

data/

Digunakan untuk menyimpan data sementara dalam format JSON sebelum kamu pakai database. Misalnya houses.json menyimpan daftar rumah yang bisa disewa.

middlewares/

Berisi fungsi middleware yang dijalankan sebelum request masuk ke controller. Misalnya upload.middleware.js untuk menangani proses upload file dengan Busboy.

models/

Digunakan untuk mendefinisikan struktur data seperti house.model.js. File ini bisa berisi constructor class atau struktur awal jika kamu pakai database nanti.

routes/

Berisi logic pemetaan path URL ke fungsi controller secara manual. Contohnya house.routes.js mengatur endpoint /api/houses dan arahkan ke controller yang sesuai.

schemas/

Berisi validasi data menggunakan library seperti Zod. Misalnya house.schema.js untuk validasi saat user menambahkan rumah baru agar inputnya sesuai aturan.

services/

Berisi logic utama aplikasi seperti membaca file JSON, menyimpan data, atau filtering. house.service.js contohnya untuk mengambil semua rumah dari file JSON atau menambah data baru.

uploads/

Folder kosong yang digunakan untuk menyimpan file hasil upload dari user. Misalnya foto rumah, yang diunggah melalui Postman akan masuk ke sini.

utils/

Berisi fungsi bantu umum, misalnya generate-id.js untuk membuat ID unik setiap kali data baru ditambahkan.

index.js

File utama yang menjalankan HTTP server dan mengatur permintaan masuk, seperti menentukan rute dan memanggil middleware.


Struktur seperti ini akan sangat membantu kamu saat proyek mulai bertambah kompleks. Setiap folder punya tanggung jawabnya sendiri, sehingga tim kamu pun bisa bekerja secara paralel tanpa mengganggu bagian lain. Cocok banget buat kamu yang mau bikin backend sederhana tapi profesional tanpa framework.

Penjelasan File-Based Database Menggunakan .json untuk Backend API Sewa Rumah

Dalam pengembangan backend API, terutagma saat proyek masih di tahap awal atau skala kecil, kita belum tentu langsung membutuhkan database besar seperti MySQL, MongoDB, atau PostgreSQL. Sebagai gantinya, kita bisa menggunakan pendekatan file-based database. Artinya, data akan disimpan dalam bentuk file .json di dalam folder proyek.

File .json ini berfungsi mirip seperti tabel dalam database, isinya berupa array of objects yang merepresentasikan data — misalnya daftar rumah yang tersedia untuk disewa. Kelebihannya: setup sangat sederhana, tidak perlu install database server, dan bisa langsung digunakan dengan fs module dari Node.js.

Metode ini cocok banget untuk belajar, prototyping, atau membangun MVP (Minimum Viable Product). Tapi perlu diingat, untuk kebutuhan produksi dengan banyak user dan skala besar, sebaiknya tetap gunakan database yang sesungguhnya.


Cara Menggunakan File-Based Database di Proyek Sewa Rumah

Langkah pertama, kamu buat file JSON di dalam folder data. Misalnya nama filenya houses.json dengan isi awal seperti ini:

[]

Isi array kosong karena nanti kita akan menambahkan rumah lewat endpoint POST.

Lalu buat file service house.service.js di dalam folder services/ untuk mengelola proses baca dan tulis ke file tersebut.

// services/house.service.js

const fs = require('fs');
const path = require('path');
const { v4: uuidv4 } = require('uuid'); // opsional, bisa buat id unik kalau pakai library ini

const filePath = path.join(__dirname, '../data/houses.json');

function readHouses() {
  const fileContent = fs.readFileSync(filePath, 'utf-8');
  return JSON.parse(fileContent);
}

function saveHouses(houses) {
  fs.writeFileSync(filePath, JSON.stringify(houses, null, 2));
}

function getAllHouses() {
  return readHouses();
}

function addHouse(newHouse) {
  const houses = readHouses();
  const houseWithId = {
    id: uuidv4(), // buat ID unik
    ...newHouse
  };
  houses.push(houseWithId);
  saveHouses(houses);
  return houseWithId;
}

module.exports = {
  getAllHouses,
  addHouse
};

Selanjutnya, buat controller untuk handle request dari user. Misalnya kita buat house.controller.js di folder controllers/.

// controllers/house.controller.js

const { getAllHouses, addHouse } = require('../services/house.service');

function handleGetHouses(req, res) {
  const houses = getAllHouses();
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify(houses));
}

function handleCreateHouse(req, res) {
  let body = '';

  req.on('data', chunk => {
    body += chunk;
  });

  req.on('end', () => {
    const data = JSON.parse(body);
    const newHouse = addHouse(data);

    res.writeHead(201, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(newHouse));
  });
}

module.exports = {
  handleGetHouses,
  handleCreateHouse
};

Terakhir, sambungkan semuanya lewat index.js:

// index.js

const http = require('http');
const url = require('url');
const { handleGetHouses, handleCreateHouse } = require('./controllers/house.controller');

const server = http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url, true);
  const method = req.method;
  const pathname = parsedUrl.pathname;

  if (method === 'GET' && pathname === '/api/houses') {
    return handleGetHouses(req, res);
  }

  if (method === 'POST' && pathname === '/api/houses') {
    return handleCreateHouse(req, res);
  }

  res.writeHead(404, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({ message: 'Route not found' }));
});

server.listen(3000, () => {
  console.log('Server berjalan di <http://localhost:3000>');
});

Kalau semuanya sudah kamu buat, kamu bisa uji coba endpoint ini di Postman. Lakukan GET untuk ambil semua rumah dan POST untuk menambah rumah baru. Data akan tersimpan otomatis di file houses.json.

Dengan pendekatan ini, kamu bisa belajar alur lengkap backend API tanpa perlu mengatur database yang kompleks. Sederhaana tapi powerful buat latihan dan membangun proyek real yang kecil.

Install dan Gunakan Busboy untuk Upload Foto Rumah di Backend API Sewa Rumah

Setelah API backend kamu berhasil membaca dan menulis data ke file .json, sekarang kita akan menambahkan fitur baru: upload foto rumah. Dalam fitur ini, foto akan diunggah oleh user melalui Postman (atau frontend nantinya), lalu disimpan di folder uploads/, sedangkan file name dan path-nya akan disimpan di file .json sebagai referensi.

Kita akan menggunakan Busboy, yaitu library ringan dan efisien untuk menangani multipart/form-data (khususnya saat user mengunggah file).


Langkah 1: Install Busboy

Buka terminal di folder proyek keamu, lalu jalankan perintah:

npm install busboy


Langkah 2: Buat Middleware Upload File

Buat folder middlewares/ kalau belum ada. Di dalamnya, buat file baru bernama upload.middleware.js.

// middlewares/upload.middleware.js

const Busboy = require('busboy');
const fs = require('fs');
const path = require('path');

function handlePhotoUpload(req, res, callback) {
  const busboy = new Busboy({ headers: req.headers });
  let fileName = '';
  let uploaded = false;

  busboy.on('file', (fieldname, file, filename) => {
    const uploadPath = path.join(__dirname, '../uploads', filename);
    fileName = filename;
    uploaded = true;

    file.pipe(fs.createWriteStream(uploadPath));

    file.on('end', () => {
      callback(null, fileName);
    });
  });

  busboy.on('finish', () => {
    if (!uploaded) {
      callback(new Error('No file uploaded'));
    }
  });

  req.pipe(busboy);
}

module.exports = {
  handlePhotoUpload
};


Langkah 3: Perbarui Service dan Controller

Buka atau buat file house.service.js di dalam folder services/. Tambahkan logic untuk menyimpan nama file ke file JSON.

// services/house.service.js

const fs = require('fs');
const path = require('path');
const { v4: uuidv4 } = require('uuid');

const filePath = path.join(__dirname, '../data/houses.json');

function readHouses() {
  const data = fs.readFileSync(filePath, 'utf-8');
  return JSON.parse(data);
}

function saveHouses(houses) {
  fs.writeFileSync(filePath, JSON.stringify(houses, null, 2));
}

function addHouseWithPhoto(photoFileName) {
  const houses = readHouses();
  const newHouse = {
    id: uuidv4(),
    title: 'Rumah Baru',
    photo: `/uploads/${photoFileName}`
  };
  houses.push(newHouse);
  saveHouses(houses);
  return newHouse;
}

module.exports = {
  addHouseWithPhoto,
  readHouses
};

Selanjutnya buka house.controller.js di folder controllers/ dan tambahkan logic untuk menangani upload foto.

// controllers/house.controller.js

const { addHouseWithPhoto, readHouses } = require('../services/house.service');
const { handlePhotoUpload } = require('../middlewares/upload.middleware');

function handleGetHouses(req, res) {
  const houses = readHouses();
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify(houses));
}

function handleUploadHousePhoto(req, res) {
  handlePhotoUpload(req, res, (err, filename) => {
    if (err) {
      res.writeHead(400, { 'Content-Type': 'application/json' });
      return res.end(JSON.stringify({ message: err.message }));
    }

    const newHouse = addHouseWithPhoto(filename);
    res.writeHead(201, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify({
      message: 'Rumah berhasil ditambahkan dengan foto',
      data: newHouse
    }));
  });
}

module.exports = {
  handleGetHouses,
  handleUploadHousePhoto
};


Langkah 4: Update index.js

Buka file index.js di root proyek, lalu arahkan endpoint POST ke handler upload foto:

// index.js

const http = require('http');
const url = require('url');
const { handleGetHouses, handleUploadHousePhoto } = require('./controllers/house.controller');

const server = http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url, true);
  const method = req.method;
  const pathname = parsedUrl.pathname;

  if (method === 'GET' && pathnamee === '/api/houses') {
    return handleGetHouses(req, res);
  }

  if (method === 'POST' && pathname === '/api/houses/upload-photo') {
    return handleUploadHousePhoto(req, res);
  }

  res.writeHead(404, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({ message: 'Route not found' }));
});

server.listen(3000, () => {
  console.log('Server berjalan di <http://localhost:3000>');
});

Cara Uji Coba API Upload Foto Rumah dengan Postman (Multipart Form Data)

Setelah backend kamu selesai dibuat menggunakan Node.js dan Busboy, sekarang saatnya kita menguji apakah fitur upload foto rumah berjalan dengan benar. Untuk itu, kita akan menggunakan Postman, sebuah tool populer untuk testing API.

Tujuan dari uji coba ini adalah mengirim file gambar (misalnya foto rumah) ke endpoint /api/houses/upload-photo, dan memastikan backend menyimpannya ke folder uploads/, serta mencatat informasi file tersebut di file houses.json.


Persiapan Sebelum Testing

Pastikan kamu sudah melakukan hal berikut:

  • Jalankan server dengan perintah node index.js
  • Folder uploads/ sudah ada di root proyek
  • File houses.json sudah tersedia di dalam folder data/ dan berisi array kosong []

Langkah Uji Coba Upload Foto Rumah di Postman

Buka aplikasi Postman dan ikuti langkah berikut:

Pilih metode POST

Masukkan URL endpoint kamu, contoh:

<http://localhost:3000/api/houses/upload-photo>

Klik tab Body → pilih opsi form-data

Tambahkan form field dengan key:

Key: photo
Type: File
Value: [pilih gambar dari komputermu]

Pastikan field type kamu adalah File, bukan Text

Klik tombol Send


Hasil yang Diharapkan

Jika semuanya berjalan dengan benar, kamu akan menerima response JSON seperti ini:

{
  "message": "Rumah berhasil ditambahkan dengan foto",
  "data": {
    "id": "3e2237b0-2b2e-4d5f-9a8b-d6bd3e8e456c",
    "title": "Rumah Baru",
    "photo": "/uploads/foto-rumah.jpg"
  }
}

Cek folder uploads/ — harusnya ada file foto-rumah.jpg atau sesuai dengan file yang kamu upload.

Buka file data/houses.json — datanya akan bertambah seperti ini:

[
  {
    "id": "3e2237b0-2b2e-4d5f-9a8wwwb-d6bd3e8e456c",
    "title": "Rumah aaBaru",
    "photo": "/uploads/foto-rumaaah.jpg"
  }
]

Penutup dan Saran untuk Backend Developer Pemula

Belajar membangun backend dari nol dengan vanilla Node.js adalah langkah awal yang luar biasa. Kamu jadi paham cara kerja HTTP server, bagaimana cara upload file tanpa bantuan framework, serta bagaimana menyimpan data di file .json secara manual. Ini adalah pondasi penting sebelum kamu melangkah ke tahap yang lebih kompleks seperti menggunakan Express, database relasional, autentikasi JWT, hingga deployment ke cloud.

Tapi kadang, belajar sendiri bisa terasa lambat dan membingungkan. Karena itu, belajar langsung bersama mentor expert di BuildWithAngga bisa jadi jalan pintas terbaik buat kamu yang ingin mempercepat karier sebagai backend developer—khususnya yang ingin bekerja remote.

Di BuildWithAngga, kamu bisa belajar hal teknis langsung dari para engineer berpengalaman, tidak hanya teori tapi juga praktik proyek nyata seperti:

  • API backend untuk aplikasi sewa rumah, POS system, dan marketplace
  • Validasi data profesional dengan Zod
  • Upload file dengan keamanan
  • eee
  • Struktur folder yang scalable untuk kerja tim
  • Simulasi kerja remote seperti di startup beneran

Dan yang paling penting, kamu akan dibimbing untuk menyiapkan portofolio dan kemampuan teknis yang dibutuhkan perusahaan luar negeri. Jadi bukan sekadar belajar ngoding, tapi benar-benar diarahkan supaya siap kerja remote dan punya penghasilan yang lebih besar dari rumah.

Kalau kamu serius ingin jadi backend developer yang siap kerja remote, jangan hanya belajar sendirian. Yuk, gabung belajar bareng mentor expert di BuildWithAngga. Siapkan masa depanmu mulai hari ini. 🚀