Lompat ke konten Lompat ke sidebar Lompat ke footer

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' &amp;&amp; req.method === 'GET') {
        return itemController.getItems();
    }

    // Route untuk mendapatkan satu item berdasarkan ID (GET /items/:id)
    if (url.pathname.match(/^\/items\/\d+$/) &amp;&amp; req.method === 'GET') {
        const id = url.pathname.split('/')[2];
        return itemController.getItem(id);
    }

    // Route untuk menambah item baru (POST /items)
    if (url.pathname === '/items' &amp;&amp; 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+$/) &amp;&amp; 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) =&gt; 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) =&gt; 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 file db.json.
  • getItem(id): Mengambil satu item berdasarkan ID.
  • createItem(data): Membuat item baru dengan menambahkannya ke db.json.
  • deleteItem(id): Menghapus item dari file db.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"