Pengalaman saya ̷m̷a̷k̷a̷n̷ pakai Bun.js - Runtime baru yang lagi viral
Bun.js ini adalah runtime yang lagi viral katanya. Kalo di bandingin dengan Deno apalagi Node, katanya ini paling cepet. Buat Buktiin segimana enaknya dan cepetnya ini si Runtime Bakpao, mau gua mau coba sih bikin project REST API tanpa framework apapun. Buat nyimpen datanya, kita make modul read/write file bawann Bun.js
Memulai dengan Bun.js
Kita coba mulai bikin entry pointnya ya
import { serve } from 'bun';
import { itemRoutes } from './src/routes/itemRoute';
const server = serve({
fetch(req) {
// Semua request dilewatkan ke fungsi itemRoutes
return itemRoutes(req);
},
port: 3000, // Server berjalan di localhost:3000
});
console.log(`Listening on http://localhost:${server.port}`);
Dengan konfigurasi di atas, server berjalan di localhost:3000
, dan semua request HTTP akan diteruskan ke itemRoutes
yang menangani berbagai endpoint REST API.
Struktur Routing REST API
Bagian penting dalam REST API itu ya gak jauh sama routing. Di proyek ini, routing diatur di dalam file itemRoute.ts
, ada berbagai endpoint yang dipetakan untuk berinteraksi dengan "item" (misalnya, GET, POST, PUT, DELETE).
Ini adalah contoh gimana routing diatur untuk menangani permintaan di REST API ini:
import { itemController } from '../controllers/itemController';
export async function itemRoutes(req: Request): Promise<response> {
const url = new URL(req.url);
// Route untuk mendapatkan semua item (GET /items)
if (url.pathname === '/items' && req.method === 'GET') {
return itemController.getItems();
}
// Route untuk mendapatkan satu item berdasarkan ID (GET /items/:id)
if (url.pathname.match(/^\/items\/\d+$/) && req.method === 'GET') {
const id = url.pathname.split('/')[2];
return itemController.getItem(id);
}
// Route untuk menambah item baru (POST /items)
if (url.pathname === '/items' && req.method === 'POST') {
const data = await req.json();
return itemController.createItem(data);
}
// Route untuk menghapus item berdasarkan ID (DELETE /items/:id)
if (url.pathname.match(/^\/items\/\d+$/) && req.method === 'DELETE') {
const id = url.pathname.split('/')[2];
return itemController.deleteItem(id);
}
return new Response('Not Found', { status: 404 });
}
Dalam contoh di atas, fungsi itemRoutes
menangani berbagai endpoint REST API, termasuk:
GET /items
: Mengambil semua item.GET /items/:id
: Mengambil satu item berdasarkan ID.POST /items
: Menambahkan item baru.DELETE /items/:id
: Menghapus item berdasarkan ID.
Pendekatan ini cukup ringkas, sehingga mudah dipahami. Kita bisa gak butuh lagi sih sama framework kaya Express.js, karena Bun.js memungkinkan kita mengelola request dan response secara langsung.
Mengelola Logika API di Controller
Buat bikin kode kita itu lebih bersih, logika API dipisahin ke dalam file itemController.ts
. Inilah tempat di mana kita melakukan operasi seperti mengambil item dari database atau menambah item baru. Di sini kita juga bisa lihat penggunaan file JSON sebagai basis data sederhana.
import { readFile, writeFile } from '../utils/fileUtils';
const dbPath = './data/db.json';
export const itemController = {
// Mengambil semua item
async getItems(): Promise<response> {
const items = await readFile(dbPath);
return new Response(JSON.stringify(items), { status: 200 });
},
// Mengambil satu item berdasarkan ID
async getItem(id: string): Promise<response> {
const items = await readFile(dbPath);
const item = items.find((i: any) => i.id === id);
if (!item) {
return new Response('Item not found', { status: 404 });
}
return new Response(JSON.stringify(item), { status: 200 });
},
// Membuat item baru
async createItem(data: any): Promise<response> {
const items = await readFile(dbPath);
const newItem = { id: (items.length + 1).toString(), ...data };
items.push(newItem);
await writeFile(dbPath, items);
return new Response(JSON.stringify(newItem), { status: 201 });
},
// Menghapus item berdasarkan ID
async deleteItem(id: string): Promise<response> {
let items = await readFile(dbPath);
items = items.filter((i: any) => i.id !== id);
await writeFile(dbPath, items);
return new Response('Item deleted', { status: 200 });
}
};
Pada controller ini, kita dapat melihat beberapa fungsi yang digunakan untuk mengelola item:
getItems()
: Mengambil semua item yang ada di filedb.json
.getItem(id)
: Mengambil satu item berdasarkan ID.createItem(data)
: Membuat item baru dengan menambahkannya kedb.json
.deleteItem(id)
: Menghapus item dari filedb.json
berdasarkan ID.
Utilitas untuk Mengelola File Data
Core dari penyimpanan data selama kita request dari Endpoint, itu kita pake utilitas ini atau bisa dibilang ada helper yang bantu kita lakuin query ke file JSON:
import { readFileSync, writeFileSync } from 'fs';
export function readFile(path: string): any {
const data = readFileSync(path, 'utf-8');
return JSON.parse(data);
}
export function writeFile(path: string, data: any): void {
writeFileSync(path, JSON.stringify(data, null, 2));
}
Dengan fungsi readFile
dan writeFile
, kita bisa dengan mudah membaca dan menulis data ke file JSON yang digunakan sebagai basis data.
Kesimpulan: Bun.js Membuat REST API Sederhana dan Cepat
Overall, puas sih bikin REST API pake Bun.js ini tanpa framework apapun. Gampang soal parsing data dari request, bikin response juga ga perlu library lain. Dibandingin dari pengalaman ngoding make node.js polosan, bun.js ini bisa dibilang lebih sederhana sih jadi itu bikin gua ngerasa kenyang.
Oia kalo kamu mau tau cara bikin REST API ini lebih detail dan lebih jelas, bisa dateng di playlist ini: https://www.youtube.com/playlist?list=PL1aMeb5UP_PEExmb7HNRe5vCXV4jT1-y_ Thank you ya
Posting Komentar untuk "Pengalaman saya ̷m̷a̷k̷a̷n̷ pakai Bun.js - Runtime baru yang lagi viral"