Wednesday, 10 December 2025

Sistem Produk Tambah Stok Tanpa Model di CodeIgniter 4 v4.6.3: Sederhana

Manajemen stok adalah salah satu fitur penting dalam aplikasi penjualan, inventori, atau gudang. Pada CodeIgniter 4, kita dapat membangun sistem produk dengan kemampuan untuk menambah stok secara fleksibel, baik melalui form input maupun melalui proses update otomatis. Artikel ini membahas langkah demi langkah membuat fitur tersebut: mulai dari struktur database, controller, hingga tampilan (view).

1. Struktur Database

Pertama, buat tabel products untuk menyimpan data produk dan stoknya.


CREATE TABLE products (
    id_product INT AUTO_INCREMENT PRIMARY KEY,
    kode_product VARCHAR(10)
    nama_product VARCHAR(50) NOT NULL,
    harga_ INT NOT NULL,
    stok INT NOT NULL DEFAULT 0
);


Kolom stok bertipe integer untuk menampung jumlah stok yang tersedia.

2. Membuat Controller Product

Controller akan menangani input pengguna, menampilkan halaman, serta melakukan proses tambah stok.

app/Controllers/Product.php



namespace App\Controllers;

class Product extends BaseController{

  protected $db;

  public function __construct(){
    $this->db = \Config\Database::connect();
  }

  public function index(): string{
    $product = $this->db->table('product')->get()->getResult();
    return view('product/index',['data'=>$product]);
  }

  public function simpan_product(){
    $kode = $this->request->getPost("kode_product");
    $nama = $this->request->getPost("nama_product");
    $harga = $this->request->getPost("harga");
    
    $cekKode = $this->db->table("product")
                        ->select("kode_product")
                        ->where("kode_product",$kode)
                        ->get()
                        ->getRow();
    
    if($cekKode !== null){
      $err = ['error'=>true, 'message'=>'kode product tidak valid !!'];
      return view("product/tambah",$err);
    }

    if($harga < 1 || $harga == ""){
      $err = ['error'=>true, 'message'=>'harga tidak boleh Nol "0" !!'];
      return view("product/tambah",$err);
    }

    //simpan
    $data = [
      "kode_product"=>$kode,
      "nama_product"=>$nama,
      "harga"=>$harga,
      "stok"=>0
    ];
    $this->db->table('product')->insert($data);

    return redirect()->to("product");
  }

  public function stok_tambah($err=null){
    $data['data'] = $this->db->table('product')->get()->getResult();
    if($err !== null){
      $data = array_merge($data,$err);
      return view('product/tambah-stok',$data);
    }
    return view('product/tambah-stok',$data);
  }

  public function stok_simpan(){
    $product = $this->request->getPost('id_product');
    $stok = $this->request->getPost('stok');

    //cek error
    if($product == 'n'){
      $err = ['error'=>true,'message'=>'Silahkan pilih kode product !!'];
      return $this->stok_tambah($err);
    }
    if($stok == '' || $stok < 1){
      $err = ['error'=>true,'message'=>'Inputkan Stok dengan benar !!'];
      return $this->stok_tambah($err);
    }
    
    //berhasil
    $data = [
      'stok'=>$stok
    ];
    $this->db->table('product')->set('stok','stok + '.$stok,false)
                              ->where('id_product',$product)
                              ->update();

    return redirect()->to('/product');
  }

}


Penjelasan:

  • index() : menampilkan data product
  • simpan_product() : menyimpan data product ke database
  • stok_tambah : menampilkan form tambah stok
  • stok_simpan() : mengupdate stok product berdasarkan kode product yang dipilih

3. Membuat View Daftar Produk 

app/Views/product/index.php 

4. Membuat View Form Tambah Stok

app/Views/product/add_stock.php 

Form ini hanya membutuhkan input angka untuk menambah stok produk.

5. Routing 

Tambahkan rute untuk controller product.

app/Config/Routes.php 


//products
$routes->get('/product', 'Product::index');
$routes->get('/product/tambah', function(){
  return view('product/tambah');
});
$routes->post('/product/simpan', 'Product::simpan_product');

//stok
$routes->get('/product/stok/tambah','Product::stok_tambah');
$routes->post('product/stok/simpan','Product::stok_simpan');

6. Membuat View Form tambah Product

app/Views/product/tambah.php 

7. Cara Kerja Sistem

Ketika admin ingin menambah stok:

  • Akses browser dengan endpoint `/product`
  • Klik tambah product, utuk menambahkan data product
  • Klik tambah stok, untuk mengubah stok product
  • Masukan jumlah stok sesuai kode product
  • sistem akan update stok product,stok lama akan ditambahkan dengan stok baru

Kesimpulan

Fitur ini dapat dikembangkan lebih lanjut, misalnya dengan catatan history stok, pengurangan stok otomatis saat transaksi, atau validasi lebih kompleks.

untuk melihat artikel lain, bisa klik Disini

  

Tuesday, 9 December 2025

Property Public Private Protected pada Class dan Penggunaannya dalam OOP PHP

Pemrograman PHP telah berkembang jauh dari sekadar bahasa scripting sederhana untuk membuat halaman web dinamis. Sejak diperkenalkannya PHP 5, konsep Object-Oriented Programming (OOP) menjadi bagian inti dalam pengembangannya. Dengan OOP, developer memiliki cara yang lebih terstruktur, rapi, dan modular dalam membangun aplikasi. Salah satu komponen penting dalam OOP PHP adalah property yang terdapat di dalam class.

Artikel ini akan membahas secara detail apa itu property, bagaimana penggunaannya, berbagai kasus yang muncul terkait property, dan bagaimana mengatasinya dengan pendekatan yang baik.

Apa Itu Property dalam PHP? 

Dalam PHP, property adalah variabel yang didefinisikan di dalam sebuah class. Property digunakan untuk menyimpan data atau state dari objek. Setiap objek yang dibuat dari class tersebut akan memiliki property sendiri, kecuali property bersifat static.

Contoh dasar:


class Mobil {
    public $merk;
    public $warna;
}

Pada contoh ini, merk dan warna adalah property class Mobil. Ketika kita membuat objek baru dari class tersebut, masing-masing objek dapat memiliki nilai property yang berbeda.

Jenis-Jenis Visibility Property 

Untuk mengontrol akses terhadap property, PHP menyediakan tiga tingkat visibility:

  • public – dapat diakses dari mana saja (di dalam class, objek, dan luar class).
  • protected – hanya dapat diakses dari dalam class dan turunannya.
  • private – hanya dapat diakses dari dalam class itu sendiri.

Contoh:


class User {
    public $nama;
    protected $email;
    private $password;
}

Dengan aturan ini, PHP memastikan keamanan data serta menjaga agar struktur kode tetap bersih dan terkendali.

Kasus Umum yang Terjadi pada Property dalam PHP

1. Property Tidak Terdefinisi (Undefined Property)

Kasus paling umum adalah pesan error seperti:


Notice: Undefined property: User::$email

Ini terjadi ketika Anda mencoba mengakses property yang tidak pernah dideklarasikan atau salah penulisan. Contoh salah:


$user = new User();
echo $user->emali; // Typo: "emali"

Cara mengatasinya tentu dengan memastikan nama property sudah benar dan dideklarasikan dalam class.

2. Mengakses Property Private atau Protected dari Luar Class 

Kesalahan lain yang sering muncul:


Fatal error: Uncaught Error: Cannot access protected property User::$email

Ini terjadi ketika developer mencoba mengakses property yang tidak bersifat public. Solusinya adalah menggunakan getter dan setter.


class User {
    protected $email;

    public function setEmail($email) {
        $this->email = $email;
    }

    public function getEmail() {
        return $this->email;
    }
}

3. Property Belum Diinisialisasi (Typed Property Error)

Sejak PHP 7.4, property dapat diberikan tipe data (typed property). Jika property tersebut digunakan sebelum diberi nilai, PHP akan menampilkan error. Contoh:


class Produk {
    public int $stok;
}

$p = new Produk();
echo $p->stok; // Error: uninitialized property

Untuk mengatasi hal ini, property harus diberi nilai default atau diinisialisasi dalam constructor:


public int $stok = 0;

Atau:


public function __construct() {
    $this->stok = 0;
}

Best Practice Mengelola Property dalam Class PHP

1. Gunakan Encapsulation

Selalu jaga property tetap private atau protected, kemudian akses menggunakan getter dan setter. Ini mencegah manipulasi langsung yang dapat merusak konsistensi data.

2. Gunakan Typed Property

Typed property membantu mencegah kesalahan tipe data, terutama pada aplikasi besar:


public string $judul;
public float $harga;

3. Inisialisasi Property dalam Constructor

Constructor memastikan setiap objek memiliki nilai awal yang benar.


public function __construct($nama, $email) {
    $this->nama = $nama;
    $this->email = $email;
}

4. Hindari Property yang Tidak Digunakan

Property yang terlalu banyak dapat membuat class membingungkan dan rentan terhadap error.

Kesimpulan 

Property dalam class PHP adalah elemen fundamental dari konsep Object-Oriented Programming. Dengan memahami cara kerjanya, aturan visibility, serta kasus-kasus umum yang sering terjadi, Anda akan dapat membangun aplikasi yang lebih rapi, aman, dan mudah dipelihara. PHP modern menawarkan fitur-fitur seperti typed property, constructor, dan encapsulation yang membantu developer mengelola property dengan lebih baik.

Dengan pemahaman yang kuat tentang property, Anda dapat membuat class yang lebih efisien, jelas, dan profesional dalam pengembangan aplikasi berbasis PHP.

Untuk melihat artikel lain bisa klik Disini 

Saturday, 6 December 2025

Sistem Login dan Register di CodeIgniter 4 versi v4.6.3

 

CodeIgniter 4 merupakan salah satu framework PHP yang ringan, cepat, dan mudah digunakan. Salah satu kebutuhan utama dalam membangun aplikasi web adalah fitur login dan register sebagai pintu gerbang autentikasi pengguna. Pada artikel ini, kita akan membahas langkah-langkah lengkap untuk membuat sistem login dan register sederhana dengan CodeIgniter 4, mulai dari konfigurasi awal, pembuatan model, controller, hingga pembuatan tampilan. Tutorial ini cocok untuk pemula yang ingin memahami dasar autentikasi di CodeIgniter 4.

1. Persiapan Proyek CodeIgniter 4

Sebelum memulai, pastikan CodeIgniter 4 sudah terinstal. Kamu bisa menginstalnya menggunakan composer dengan perintah:


composer create-project codeigniter4/appstarter ci4-login

Setelah itu, jalankan server lokal:


php spark serve

Jika CodeIgniter sudah berjalan, kita siap masuk ke pembuatan fitur login dan register.

2. Membuat Tabel User di Database


CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Pada kolom password, kita akan menyimpan password yang telah di-hash agar lebih aman.

3. Konfigurasi Koneksi Database

Buka file: app/Config/Database.php

Sesuaikan dengan konfigurasi lokalmu:


public $default = [
    'DSN'      => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'ci4_auth',
    'DBDriver' => 'MySQLi',
];

4. Membuat Model User

Model digunakan untuk berinteraksi dengan tabel users.

Buat file baru: app/Models/UserModel.php 


namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table            = 'users';
    protected $primaryKey       = 'id';
    protected $useAutoIncrement = true;
    protected $returnType       = 'array';
    protected $useSoftDeletes   = false;
    protected $protectFields    = true;
    protected $allowedFields    = ['username', 'email', 'password'];

    protected bool $allowEmptyInserts = false;
    protected bool $updateOnlyChanged = true;

    protected array $casts = [];
    protected array $castHandlers = [];

    // Dates
    protected $useTimestamps = false;
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    protected $deletedField  = 'deleted_at';

    // Validation
    protected $validationRules      = [];
    protected $validationMessages   = [];
    protected $skipValidation       = false;
    protected $cleanValidationRules = true;

    // Callbacks
    protected $allowCallbacks = true;
    protected $beforeInsert   = [];
    protected $afterInsert    = [];
    protected $beforeUpdate   = [];
    protected $afterUpdate    = [];
    protected $beforeFind     = [];
    protected $afterFind      = [];
    protected $beforeDelete   = [];
    protected $afterDelete    = [];
}

5. Membuat Controller Auth

Controller ini akan mengatur register, login, dan logout.

Buat file: app/Controllers/Auth.php 

Register:


public function register()
{
    return view('auth/register');
}

public function saveRegister(){
	$userModel = new UserModel();
		
	$cekUsername = $userModel->where('username', $this->request->getPost('username'))->first();
	$cekEmail = $userModel->where('email', $this->request->getPost('email'))->first();

	if ($cekUsername) {
		return redirect()->back()->with('error', 'Username sudah digunakan!');
	}
	if ($cekEmail) {
		return redirect()->back()->with('error', 'Email sudah digunakan!');
	}

	$data = [
    	'username' => $this->request->getPost('username'),
		'email'    => $this->request->getPost('email'),
		'password' => password_hash($this->request->getPost('password'), PASSWORD_DEFAULT),
	];

	$userModel->insert($data);

	return redirect()->to('/login')->with('success', 'Register berhasil!');
}

Login:


public function login()
{
    return view('auth/login');
}

public function doLogin(){
	$session = session();
	$userModel = new UserModel();

	$email = $this->request->getPost('email');
	$password = $this->request->getPost('password');

	$user = $userModel->where('email', $email)->first();

	if ($user) {
		if (password_verify($password, $user['password'])) {
			$session->set([
				'user_id'  => $user['id'],
				'username' => $user['username'],
				'logged_in'=> true
			]);
			return redirect()->to('/');
		} else {
			return redirect()->back()->with('error', 'Password salah!');
		}
	} else {
		return redirect()->back()->with('error', 'Email tidak ditemukan!');
	}
}

Logout:


public function logout()
{
    session()->destroy();
    return redirect()->to('/login');
}

6. Membuat Tampilan Register dan Login

Tampilan Register: app/Views/auth/register.php 

Tampilan Login: app/Views/auth/login.php

7. Membuat Controller Home


namespace App\Controllers;

use App\Libraries\ResponseApi;

class Home extends BaseController{

  public function index(){   
    if(!session()->get('logged_in')){
      return redirect()->to('/login');
    } 
    return view('home');
  }
  
}

Tambahkan file home.php pada View/home.php: 

8. Menambahkan Routing

Tambahkan ke file app/Config/Routes.php:



$routes->get('/', 'Home::index');
$routes->get('/register', 'Auth::register');
$routes->post('/save-register', 'Auth::saveRegister');

$routes->get('/login', 'Auth::login');
$routes->post('/do-login', 'Auth::doLogin');

$routes->get('/logout', 'Auth::logout');


Kesimpulan

Membangun sistem login dan register di CodeIgniter 4 cukup mudah dan terstruktur. Dengan memanfaatkan fitur bawaan seperti Model, Controller, dan View, kita dapat membuat autentikasi yang aman menggunakan hash password. Sistem sederhana ini bisa dikembangkan menjadi lebih kompleks, seperti verifikasi email, reset password, atau penerapan role dan level akses pengguna. 

Untuk melihat artikel yang lain, bisa klik Disini 

Wednesday, 26 November 2025

Tutorial MongoDB connect to express JS use Driver MongoDB v7.0.0

 

Dalam pengembangan aplikasi backend dengan Node.js dan Express, MongoDB merupakan salah satu pilihan database NoSQL yang sangat populer. Banyak developer memilih menggunakan Mongoose untuk mengelola database karena menyediakan schema, validasi, dan abstraction layer. Namun, sebagian lainnya lebih menyukai menggunakan MongoDB Native Driver karena sifatnya yang lebih ringan, fleksibel, dan memberikan kontrol penuh terhadap interaksi langsung dengan database. Artikel ini akan membahas cara membuat koneksi MongoDB pada aplikasi Express menggunakan driver resmi MongoDB, mulai dari instalasi hingga konfigurasi koneksi yang baik dan aman.

1. Mengapa Menggunakan MongoDB Native Driver?

Sebelum masuk ke langkah-langkah teknis, penting untuk memahami alasan memilih MongoDB Driver dibanding Mongoose:

    a. Lebih ringan dan tanpa lapisan abstraksi tambahan

Driver ini berkomunikasi langsung dengan database tanpa schema enforcement. Cocok untuk proyek yang membutuhkan fleksibilitas atau performa tinggi.

    b. Kontrol penuh terhadap query dan operasi database 

Karena tidak ada ODM yang membungkus query, developer lebih bebas melakukan operasi kompleks.

    c. Lebih cocok untuk arsitektur mikroservis 

Banyak mikroservis modern menggunakan driver native agar footprint aplikasi lebih kecil.

    4. Mendukung penuh fitur terbaru MongoDB 

Kadang fitur baru MongoDB tersedia lebih awal pada driver dibanding di ODM seperti Mongoose.

2. Persiapan Proyek 

Pastikan Node.js dan npm sudah terinstal. Mulailah dengan membuat direktori baru:


mkdir express-mongodb-driver
cd express-mongodb-driver

Inisialisasi proyek:


npm init -y

Instal Express dan MongoDB driver:


npm install express mongodb

Jika ingin mempermudah pengembangan, install nodemon:


npm install --save-dev nodemon

3. Struktur Proyek


express-mongodb-driver/
│
├── server.js
└── config/
    └── database.js

File database.js akan menyimpan konfigurasi koneksi database. 

4. Membuat Koneksi MongoDB

Buat file config/database.js berisi:  


const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);

let db;

const connectDB = async () => {
    try {
        await client.connect();
        console.log('Berhasil terhubung ke MongoDB');

        db = client.db('database_name'); // nama database
    } catch (error) {
        console.error('Gagal terhubung ke MongoDB:', error.message);
        process.exit(1);
    }
};

const getDB = () => {
    if (!db) {
        throw new Error('Database belum terkoneksi!');
    }
    return db;
};

module.exports = { connectDB, getDB };

Penjelasan:

  • MongoClient adalah class inti untuk membuat koneksi ke server MongoDB.
  • client.connect() digunakan untuk membuka koneksi.
  • db = client.db('nama_database') menyimpan reference database.
  • Fungsi getDB() berguna agar database bisa dipanggil dari file lain tanpa membuat koneksi baru.

5. Menghubungkan MongoDB pada Express

Buka file server.js dan isi seperti berikut:


const express = require('express');
const { connectDB, getDB } = require('./config/database');

const app = express();
app.use(express.json());

// Koneksi ke database
connectDB();

app.get('/', (req, res) => {
    res.send('Aplikasi Express dengan MongoDB Native Driver');
});

// Contoh route yang mengambil data dari database
app.get('/user', async (req, res) => {
    try {
        const db = getDB();
        const users = await db.collection('users').find().toArray();
        res.json(users);
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
});

const PORT = 3000;
app.listen(PORT, () => console.log(`Server berjalan pada port ${PORT}`));

Beberapa hal penting:

  • Kita memanggil connectDB() saat aplikasi dijalankan.
  • Untuk mengakses MongoDB di route Express, kita memanggil getDB() untuk mengambil instance database yang sudah terkoneksi.
  • Contoh route /users menunjukkan cara mengambil data dari koleksi menggunakan driver native.

6. Menjalankan Aplikasi

Jalankan server dengan:  


node server.js

Atau menggunakan nodemon:


npx nodemon server.js

Jika berhasil, Anda akan melihat:

$ npx nodemon server.js
[nodemon] 3.1.11
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node server.js`
Server berjalan pada port 3000
Berhasil terhubung ke MongoDB

Meskipun databasenya belum dibuat, mongodb akan membuat otomatis sesuai dengan nama database pada konfigurasi koneksi.

Jika kalian akses browset localhost:3000/user, akan kosong karna memamng datanya tidak ada, untuk membuktikannya silahkan buatk route baru misal user-add:


app.get('/user-add', async(req, res) => {
    try {
        const db = getDB();
        const users = await db.collection('users').insertOne({name:'Naruto', email:'naruto@konoha.com'});
        res.json(users);
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
});

akses browser localhost:3000/user-add, setelah itu buka lagi localhost:3000/user, maka datanya akan ada sesuai yang di tambahkan sebelumnya.

7. Kesimpulan

Menggunakan MongoDB Native Driver pada aplikasi Express memberikan fleksibilitas maksimum dan performa lebih ringan dibanding menggunakan ODM seperti Mongoose. Walaupun Anda tidak mendapatkan fitur seperti schema, model, atau validasi otomatis, Anda memperoleh kontrol penuh atas operasi database dan dapat memanfaatkan fitur terbaru MongoDB tanpa menunggu update library lain.

Pendekatan ini cocok untuk aplikasi kecil, backend dengan performa tinggi, atau mikroservis yang membutuhkan jejak memori minimal. Dengan struktur yang modular, seperti memisahkan koneksi database ke dalam file khusus, aplikasi menjadi lebih rapi dan mudah diperluas.

Untuk melihat artikel yang lain bisa klik DisiniUntuk versi yang menggunakan Mongoose bisa cek Disini

Tutorial MongoDB connect to express JS use Mongoose 9.0.0

 

Dalam pengembangan aplikasi berbasis Node.js, penggunaan MongoDB sebagai database NoSQL sangat populer karena fleksibel, cepat, dan mudah diintegrasikan dengan berbagai framework JavaScript. Salah satu pendekatan paling umum untuk mengelola koneksi dan operasi database MongoDB dalam aplikasi Express adalah melalui Mongoose, sebuah Object Data Modeling (ODM) yang menyediakan struktur lebih terorganisasi untuk bekerja dengan MongoDB. Artikel ini akan membahas langkah-langkah membuat koneksi database MongoDB pada Express menggunakan Mongoose, mulai dari instalasi hingga konfigurasi koneksi dan penanganan error.

Ada 2 cara dalam membuat koneksi dari express ke mongodb, yaitu dengan cara minginstal driver mongoose, atau install driver mongodb. Pada artikel ini kita akan membahas koneksi dengan menggunakan driver mongoose.

1. Mengapa Menggunakan Mongoose? 

Mongoose menawarkan beberapa kelebihan penting, antara lain:

  • Schema-based Modeling : Anda bisa menentukan struktur data berupa schema, sehingga data lebih terorganisasi.
  • Validasi Otomatis : Mongoose menyediakan validator untuk memastikan data sesuai sebelum dimasukkan ke database.
  • Middleware / Hooks : Sangat berguna untuk menjalankan operasi sebelum atau sesudah aksi tertentu seperti save, update, dsb.
  • Query Builder yang Mudah Digunakan : Mongoose menyediakan API yang mudah dibaca dan digunakan.

Dengan fitur-fitur tersebut, Mongoose menjadi pilihan utama bagi developer Node.js yang ingin mengelola MongoDB dengan lebih rapi dan terstruktur. 

2. Persiapan Proyek

Pertama kali pastikan kalian sudah menginstall MongoDB Community Server jika belum bisa cek Disini, selanjutnya pastikan Node.js dan npm sudah terinstal. Buat direktori baru untuk proyek:


mkdir express-mongoose
cd express-mongoose

Inisialisasi proyek:


npm init -y

Kemudian instal Express dan Mongoose:


npm install express mongoose

Untuk kebutuhan pengembangan, Anda juga dapat menginstal nodemon:


npm install --save-dev nodemon

agar server pada express nanti otomatis reload tanpa harus jalankan ulang server

3. Struktur Proyek

Gunakan struktur sederhana seperti berikut:


express-mongoose-app/
│
├── server.js
└── config/
    └── database.js

Folder config digunakan untuk menyimpan konfigurasi koneksi database agar lebih rapi.

4. Membuat File Koneksi MongoDB

Buat file config/database.js dan isi dengan kode berikut:


const mongoose = require('mongoose');

const connectDB = async()=>{
    try {
      //  digunakan untuk memaksa Mongoose agar hanya mempertimbangkan field yang ada dalam skema saat melakukan query ke basis data
      mongoose.set('strictQuery', true);

      //koneksi ke mongodb
      await mongoose.connect('mongodb://localhost:27017/database_name');
      console.log('Berhasil terhubung ke MongoDB');
    } catch (error) {
        console.error('Gagal terhubung ke MongoDB:', error.message);
    }
};

module.exports = connectDB;

Jika Anda menggunakan MongoDB Atlas, cukup ganti URL koneksi menjadi connection string dari Atlas.

5. Menghubungkan Database pada Express

Sekarang buka file server.js dan isi sebagai berikut:


const express = require('express');
const connectDB = require('./config/database');

const app = express();

// Middleware untuk parsing JSON
app.use(express.json());

// Panggil koneksi database
connectDB();

app.get('/', (req, res) => {
    res.send('Aplikasi Express dengan Mongoose');
});

const PORT = 3000;
app.listen(PORT, () => console.log(`Server berjalan pada port ${PORT}`));

Saat server dijalankan, Express akan otomatis menghubungkan diri ke MongoDB sebelum menerima request.

6. Menjalankan Server

Jalankan server dengan:


node server.js

Atau jika menggunakan nodemon:


npx nodemon server.js

Jika koneksi berhasil, Anda akan melihat output:


$ npx nodemon server.js
[nodemon] 3.1.11
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node server.js`
Server berjalan pada port 3000
Berhasil terhubung ke MongoDB

7. Kesimpulan

Menghubungkan Express dengan MongoDB menggunakan Mongoose memberikan banyak keuntungan, terutama dalam hal struktur kode, validasi data, dan kemudahan penggunaan. Dengan memisahkan konfigurasi koneksi ke dalam file khusus, aplikasi menjadi lebih modular dan mudah dikembangkan. Langkah-langkah di atas dapat digunakan sebagai dasar dalam membangun aplikasi backend yang lebih kompleks termasuk penambahan model, controller, dan rute API.

untuk melihat artikel yang lain bisa klik Disiniuntuk versi yang menggunakan driver mongodb bisa lihat Disini

Tuesday, 25 November 2025

Install Prisma client versi 7.0.1 Pada Express JS

 

Prisma adalah next-generation ORM yang membantu developer bekerja dengan database secara efisien, aman, dan mudah. Prisma membuat proses query database menjadi lebih intuitif berkat Prisma Client yang dikompilasi otomatis dari schema yang kita definisikan. Pada artikel ini, kita akan membahas langkah-langkah instalasi Prisma Client pada aplikasi Express.js, mulai dari setup awal hingga siap digunakan.

1. Persiapan Lingkungan 

Sebelum memulai, pastikan Anda sudah menginstal beberapa hal berikut:

  • Node.js versi terbaru (minimal 14.x)
  • npm atau yarn 
  • Database yang akan digunakan, misalnya PostgreSQL, MySQL, SQLite, SQL Server atau MongoDB (dengan Prisma Mongo connector)

Pada saat artikel ini dibuat, saya menggunakan Node js versi 22.19.0,


express$ node -v
v22.19.0

Setelah semuanya siap, buat folder project baru dan lakukan inisialisasi: 


mkdir express
cd express
npm init -y

Selanjutnya install Express:


npm install express

Pada prisma client versi 7.0.1, kita akan menggunakan project typescript, karena jika menggunakan project js biasa akan bermasalah. 

2. Setup Project typescript

install dev-depedensi yang diperlukan:


npm install @types/express @types/node tsx typescript --save-dev

Selanjutnya ketikan


npx tsc --init

Buka file tsconfig.json dan ubah menjadi seperti ini:


{
  // Visit https://aka.ms/tsconfig to read more about this file
  "compilerOptions": {
    // File Layout
    "rootDir": "./src",
    "outDir": "./dist",
    // Environment Settings
    // See also https://aka.ms/tsconfig/module
    "module": "esnext",
    "target": "es2023",
    "types": [],
    // For nodejs:
    // "lib": ["esnext"],
    // "types": ["node"],
    // and npm install -D @types/node

    // Other Outputs
    "sourceMap": true,
    "declaration": true,
    "declarationMap": true,

    // Stricter Typechecking Options
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,

    // Style Options
    // "noImplicitReturns": true,
    // "noImplicitOverride": true,
    // "noUnusedLocals": true,
    // "noUnusedParameters": true,
    // "noFallthroughCasesInSwitch": true,
    // "noPropertyAccessFromIndexSignature": true,

    // Recommended Options
    "strict": true,
    "jsx": "react-jsx",
    "verbatimModuleSyntax": true,
    "isolatedModules": true,
    "noUncheckedSideEffectImports": true,
    "moduleDetection": "force",
    "skipLibCheck": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
  },
  "include": ["src/**/*"],
    "exclude": ["node_modules", "dist"],
}

Kemudian ubah juga file package.json, tambahkan type module


"type": "module",
  "keywords": [],
  

3. Menginstal Prisma dan Setup Awal

Prisma terdiri dari dua paket utama: Prisma CLI dan Prisma Client. CLI digunakan untuk mengelola schema, migrasi, dan utility lainnya, sedangkan Prisma Client digunakan di dalam kode Express. 

Install Prisma CLI dan yang lainya sebagai dev-depedensi:


npm install prisma --save-dev

Install juga depedensi yang lain 


npm install @prisma/adapter-mariadb @prisma/client dotenv

Setelah itu lakukan inisialisasi Prisma:


npx prisma init

Command ini akan menghasilkan folder baru bernama prisma/ yang berisi file schema.prisma. Selain itu Prisma akan membuat file .env yang digunakan untuk menyimpan variabel lingkungan, salah satunya koneksi database.

berikut versi prisma yang saya pakai:


express$ npx prisma -v
Loaded Prisma config from prisma.config.ts.

Prisma schema loaded from prisma/schema.prisma
prisma               : 7.0.1
@prisma/client       : 7.0.1
Operating System     : linux
Architecture         : x64
Node.js              : v22.19.0
TypeScript           : 5.9.3 

3. Mengatur Koneksi Database 

Buka file .env dan sesuaikan DATABASE_URL dengan database yang akan digunakan. Contoh jika menggunakan Mysql: 


DATABASE_URL="mysql://root:123@localhost:3306/belajar"

contoh diatas menggunakan database mysql, username=root, dan password mysqlnya adalah 123, dan nama databasenya adalah belajar, sesuaikan dengan pengaturan database kalian pada komputer atau laptop.

4. Membuat Schema Prisma

Buka file prisma/schema.prisma. Pastikan isinya seperti berikut:


generator client {
  provider = "prisma-client"
  output   = "../src/generated/prisma"
}

datasource db {
  provider = "mysql"
}

jika kalian menggunakan text editor Visual Studio Code, dan melihat baris merah pada bagian datasource db{provider="mysql"}, biarkan saja, karena pada versi sebelumnya ada tambahan url. itu bukan berarti error, itu hanya tatacara penulisan yang dianggap salah oleh text editornya.

Selanjutnya, Contoh sederhana untuk membuat model User:


generator client {
  provider = "prisma-client"
  output   = "../src/generated/prisma"
}

datasource db {
  provider = "mysql"
}

model users {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
 }

Setelah membuat schema, jalankan migrasi:


npx prisma migrate dev --name create_table_users

maka akan membuat sebuat folder didalam prisma/migrations, dan membuat table pada database dengan nama users.

Jika Error


Loaded Prisma config from prisma.config.ts.

Prisma schema loaded from prisma/schema.prisma
Datasource "db": MySQL database "belajar" at "localhost:3306"

- Drift detected: Your database schema is not in sync with your migration history.

The following is a summary of the differences between the expected database schema given your migrations files, and the actual schema of the database.

It should be understood as the set of changes to get from the expected schema to the actual schema.

[+] Added tables
  - users

- The following migration(s) are applied to the database but missing from the local migrations directory: 20251126045630_create_table_users

We need to reset the MySQL database "belajar" at "localhost:3306"

You may use prisma migrate reset to drop the development database.
All data will be lost.

Jalankan npx prisma migrate reset, dan ulangi lagi 


npx prisma migrate dev --name create_table_users

Setelah itu jalankan prisma generate


npx prisma generate

5. Menggunakan Prisma Client pada Express.js

Buat folder src dan buat file didalam folder src index.ts sebagai server Express:


import "dotenv/config";
import express from 'express';
import { PrismaMariaDb } from '@prisma/adapter-mariadb';
import { PrismaClient } from "./generated/prisma/client";

const app = express();
const adapter = new PrismaMariaDb({
  host: "localhost",
  user: "root",
  password: "123",
  database: "belajar",
  connectionLimit: 5
});
const prisma = new PrismaClient({ adapter });

app.use(express.json());

// Route: menambahkan user
app.get('/add-user', async (req, res) => {
  const name = "Naruto Uzumaki";
  const email = "naruto@konoha.com";
  const user = await prisma.users.create({
    data: { name, email }
  });
  res.json(user);
});

// Route: mendapatkan semua user
app.get('/user', async (req, res) => {
  const users = await prisma.users.findMany();
  res.json(users);
});

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Aplikasi Anda sekarang sudah terhubung dengan Prisma dan siap melakukan query database dengan sintaks yang clean dan modern.

jalankan server dengan perintah pada terminal : 


npx tsx src/index.ts

akses browser dengan localhost:3000/add-user, untuk menambah user tetapi jangan di akses lebih 1 kali karna akan error, ini disebabkan karna email pada database harus unique tidak boleh sama jadi solusinya ubah dulu emailnya baru jalankan lagi routenya, untuk melihat list user akses dengan localhost:3000/user

Kesimpulan 

Instalasi Prisma Client pada Express.js tidaklah sulit. Dengan beberapa langkah mulai dari inisialisasi project, setup schema, migrasi, hingga penggunaan Prisma Client di dalam routing Express, Anda bisa mendapatkan ORM yang powerful dan mudah digunakan. Prisma memberikan banyak keuntungan seperti pengetikan yang kuat (type safety), auto-completion, dan struktur query yang rapi sehingga meningkatkan produktivitas developer.

Dengan mengikuti panduan di atas, sekarang Anda sudah dapat membangun aplikasi Express dengan akses database yang lebih efisien menggunakan Prisma.

Untuk melihat artikel yang lain, bisa klik Disini

Sunday, 23 November 2025

Kelebihan dan Kekurangan Hono JS untuk Pengembangan Web Modern

 

Dunia pengembangan web semakin berkembang dengan cepat, terutama pada ranah serverless dan edge computing. Salah satu framework yang sedang naik daun dalam kategori ini adalah Hono JS, sebuah framework web super ringan dan berperforma tinggi yang dirancang untuk berjalan di berbagai runtime seperti Cloudflare Workers, Deno, Bun, Vercel Edge Functions, dan Node.js. Dengan desain minimalis serta API yang intuitif, Hono menjadi pilihan menarik bagi developer yang menginginkan solusi cepat, sederhana, dan efisien.

Namun, seperti teknologi lainnya, Hono tidak hanya memiliki kelebihan tetapi juga kekurangan yang perlu dipertimbangkan sebelum memilihnya untuk proyek nyata. Artikel ini akan membahas keduanya secara menyeluruh agar kamu bisa menentukan apakah Hono cocok untuk kebutuhan pengembanganmu.

Apa itu Hono JS? 

Hono adalah framework web micro yang berfokus pada performa dan portabilitas. Pendekatannya mirip dengan Express dalam hal kemudahan penggunaan, tetapi sangat berbeda dalam hal performa dan target runtime. Dengan ukuran yang sangat kecil—bahkan hanya beberapa kilobyte—Hono mampu memberikan kecepatan routing yang tinggi dan pengalaman developer yang sangat nyaman.

Kelebihan Hono JS 

1. Super Cepat dan Efisien 

Salah satu nilai jual terbesar Hono adalah performa luar biasa dalam hal routing dan eksekusi. Karena dirancang untuk berjalan di environment edge seperti Cloudflare Workers, Hono dioptimalkan untuk startup time yang sangat rendah dan eksekusi yang cepat. Bagi aplikasi yang membutuhkan latency minimal, Hono adalah pilihan ideal.

2. Sangat Ringan (Lightweight) 

Hono memiliki ukuran sangat kecil dibandingkan framework web lainnya. Hal ini membuat deploy lebih cepat dan konsumsi resource lebih minim. Pada platform edge, ukuran yang ringan menjadi poin penting karena setiap byte memengaruhi kecepatan cold start.

3. Mendukung Banyak Runtime 

Tidak seperti framework tradisional yang terikat pada Node.js, Hono mendukung berbagai runtime modern seperti:

Kemampuan ini menjadikan Hono sangat fleksibel dan future-proof.

4. API yang Modern dan Mudah Dipahami 

Hono menawarkan API yang sangat mirip dengan standar Web API seperti Request dan Response. Contoh routing sederhana:


import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.text('Hello Hono!'))

export default app

Sederhana, clean, dan langsung bisa digunakan tanpa konfigurasi rumit.

5. Cocok untuk Aplikasi Serverless dan Edge 

Hono sangat cocok untuk aplikasi yang berjalan di edge, seperti API mikro, personal dashboard, atau layanan caching. Dengan waktu startup cepat dan konsumsi resource kecil, Hono menjadi solusi yang unggul untuk arsitektur modern.

6. Dokumentasi yang Jelas dan Komunitas yang Tumbuh Pesat 

Walaupun relatif baru, Hono memiliki dokumentasi lengkap dan contoh implementasi yang mudah dipahami. Komunitasnya juga berkembang cepat, terutama di kalangan developer yang fokus pada cloud-native.

Kekurangan Hono JS 

1. Ekosistem Belum Seluas Express atau NestJS 

Sebagai framework baru, ekosistem Hono masih kalah jauh dari Express, Koa, Fastify, atau NestJS. Perpustakaan dan middleware khusus Hono masih terbatas, meskipun jumlahnya terus bertambah. Untuk proyek besar yang membutuhkan banyak plugin siap pakai, Hono mungkin belum ideal.

2. Terlalu Fokus pada Edge Runtime 

Walau mendukung Node.js, Hono sebenarnya dirancang terutama untuk platform edge. Jika proyekmu murni berjalan pada server traditional atau aplikasi monolit besar, framework seperti Fastify atau Express mungkin menawarkan kenyamanan lebih.

3. Belum Cocok untuk Arsitektur Kompleks 

Hono sangat bagus untuk API kecil hingga medium. Namun untuk arsitektur enterprise yang memerlukan modularisasi besar, dependency injection, atau manajemen lifecycle aplikasi yang lebih kompleks, Hono bisa terasa terlalu minimalis.

4. Sedikit Learning Curve untuk Developer Tradisional 

Karena menggunakan Web Standard API secara penuh, developer yang sudah terbiasa dengan gaya Node.js klasik mungkin perlu waktu untuk menyesuaikan diri, terutama dalam hal request/response handling.

Kesimpulan 

Hono JS adalah framework modern yang membawa pendekatan baru ke dunia pengembangan web: cepat, ringan, minimalis, dan sangat kompatibel dengan berbagai platform serverless dan edge. Kelebihannya menjadikannya ideal untuk aplikasi yang membutuhkan performa tinggi, latency rendah, dan footprint kecil.

Namun, Hono bukan solusi sempurna untuk semua kasus. Ekosistem yang belum matang dan minimnya fitur untuk arsitektur skala besar menjadikannya lebih cocok untuk aplikasi kecil hingga menengah atau microservices modern.

Jika kamu ingin mengembangkan API cepat dan efisien, terutama di platform edge seperti Cloudflare Workers atau Bun, Hono merupakan pilihan yang sangat kuat. Tetapi untuk aplikasi besar dan kompleks, framework yang lebih matang tetap menjadi opsi yang lebih aman.

Untuk melihat artikel yang lain, bisa klik Disini