Cara Menghubungkan Node.js dengan Database (MongoDB/MySQL)
Node.js telah menjadi salah satu platform paling populer untuk membangun aplikasi backend modern. Salah satu alasan utamanya adalah ekosistem yang besar, dukungan komunitas yang kuat, dan kemudahan untuk menghubungkan Node.js dengan berbagai macam database, termasuk MongoDB dan MySQL. Dalam artikel ini, kita akan membahas cara menghubungkan Node.js dengan kedua tipe database tersebut—mulai dari instalasi, konfigurasi, hingga contoh kode dasar yang siap digunakan.
1. Pengenalan Singkat Node.js
Node.js adalah runtime JavaScript yang berjalan di sisi server. Artinya, kita bisa menjalankan JavaScript di luar browser. Biasanya, Node.js sering dipakai untuk membangun API (Application Programming Interface), real-time applications seperti chat, serta berbagai sistem yang membutuhkan performa tinggi.
Untuk mulai menggunakan Node.js, kita perlu menginstalnya terlebih dahulu dari situs resminya (https://nodejs.org). Setelah terinstal, kita bisa menggunakan perintah node -v
di terminal atau command prompt untuk memastikan versi Node.js yang terpasang.
Selain Node.js, kita biasanya juga menggunakan npm (Node Package Manager) atau yarn untuk mengelola paket-paket yang dibutuhkan. Misalnya, untuk menginstal suatu library, kita bisa jalankan perintah:
npm install
atau
yarn add
Dalam konteks database, kita akan membutuhkan paket-paket khusus yang menghubungkan Node.js dengan database pilihan kita. Misalnya, untuk MongoDB kita bisa menggunakan Mongoose atau driver resmi MongoDB, sedangkan untuk MySQL kita bisa menggunakan mysql
, mysql2
, atau ORM seperti Sequelize.
2. Persiapan Umum Sebelum Menghubungkan Ke Database
-
Folder Proyek
Buatlah folder untuk proyek Node.js kita. Misalnya:mkdir project-database cd project-database
Di dalam folder ini kita akan menempatkan semua file dan konfigurasi.
-
Inisialisasi Proyek
Selanjutnya, inisialisasi proyek dengannpm init
atauyarn init
. Biasanya kita akan diminta mengisi beberapa informasi seperti nama proyek, versi, deskripsi, dan lain-lain. Proses ini akan menghasilkan sebuah filepackage.json
yang berisi detail proyek berikut daftar dependencies. -
File Utama (entry point)
Secara default, file utama proyek Node.js sering dinamaiindex.js
atauapp.js
. Kita bisa buat file baru, misalnyaapp.js
, yang nanti akan menjadi pintu masuk ke aplikasi kita. -
Instalasi Dependensi
- Untuk MongoDB dengan Mongoose, kita bisa jalankan:
npm install mongoose
yarn add mongoose
- Untuk MongoDB dengan driver resmi (opsional, jika tidak pakai Mongoose):
npm install mongodb
- Untuk MySQL, ada beberapa pilihan, tapi yang populer adalah:
npm install mysql2
- Jika ingin menggunakan Sequelize (ORM untuk SQL), maka:
npm install sequelize mysql2
mysql2
.)
- Untuk MongoDB dengan Mongoose, kita bisa jalankan:
3. Menghubungkan Node.js dengan MongoDB
3.1. Sekilas Tentang MongoDB
MongoDB adalah database NoSQL berbasis dokumen yang menggunakan format JSON (BSON di bawah 'kap mesin'). Ia populer karena fleksibilitas struktur datanya. Jika kamu sering bekerja dengan data semi-terstruktur, MongoDB bisa jadi pilihan tepat.
Untuk menggunakan MongoDB, kamu bisa memasangnya di komputer sendiri (melalui MongoDB Community Edition) atau memanfaatkan layanan hosting seperti MongoDB Atlas, yang memungkinkan kita punya database di cloud tanpa harus repot mengelola server database sendiri.
3.2. Contoh Koneksi MongoDB Menggunakan Mongoose
3.2.1. Instalasi MongoDB (Opsional Jika Pakai Cloud)
- Unduh dan install MongoDB Community Edition dari situs resminya (https://www.mongodb.com/try/download/community).
- Setelah terinstal, jalankan service MongoDB (tergantung sistem operasi).
- Secara default, MongoDB berjalan di port 27017.
Jika menggunakan MongoDB Atlas (cloud):
- Buat akun di https://www.mongodb.com/cloud/atlas.
- Ikuti langkah-langkah untuk membuat cluster.
- Setelah cluster siap, kamu akan diberikan URL koneksi. Biasanya akan berbentuk seperti ini:
mongodb+srv://:@cluster0.abcde.mongodb.net/?retryWrites=true&w=majority
- Kita akan menyalin URL ini dan meletakkannya di dalam kode kita nanti.
3.2.2. Koneksi Dasar Dengan Mongoose
Mongoose adalah library ODM (Object Data Modeling) yang membantu kita mengelola skema (schema) dan berinteraksi dengan MongoDB secara lebih mudah. Selain menghandle koneksi, Mongoose juga membantu membuat model data.
- Pastikan kita sudah berada di folder proyek.
- Instal Mongoose:
npm install mongoose
- Di file
app.js
, kita tuliskan:const mongoose = require('mongoose'); // URL koneksi ke MongoDB (bisa localhost atau MongoDB Atlas) const dbURL = 'mongodb://127.0.0.1:27017/mydatabase'; // atau contoh untuk Atlas: // const dbURL = 'mongodb+srv://username:password@cluster0.abcde.mongodb.net/mydatabase'; // Opsional: Tambahkan opsi konfigurasi const options = { useNewUrlParser: true, useUnifiedTopology: true, }; mongoose.connect(dbURL, options) .then(() => { console.log('Terhubung ke MongoDB dengan sukses!'); }) .catch(err => { console.error('Gagal terhubung ke MongoDB:', err); }); // Contoh mendefinisikan schema dan model const userSchema = new mongoose.Schema({ nama: { type: String, required: true }, email: { type: String, required: true, unique: true }, umur: Number }); const User = mongoose.model('User', userSchema); // Menyimpan data contoh const userBaru = new User({ nama: 'Budi', email: 'budi@example.com', umur: 25 }); userBaru.save() .then(doc => { console.log('Data user berhasil disimpan:', doc); }) .catch(err => { console.error('Gagal menyimpan data user:', err); });
Penjelasan kode di atas:
- Kita impor Mongoose.
- Kita set URL koneksi (bisa lokal atau dari Atlas).
- Kita panggil
mongoose.connect(...)
dengan opsi-opsi tertentu untuk mencegah peringatan deprecation. - Jika koneksi berhasil, akan muncul pesan “Terhubung ke MongoDB dengan sukses!” di console. Jika gagal, akan ada pesan error.
- Kita definisikan schema dan model untuk koleksi
Users
. Di MongoDB, nama koleksi otomatis akan menjadi bentuk jamak, misalnya “users”. - Kita membuat instance
User
bernamauserBaru
, dan menyimpannya ke database dengan.save()
. - Jika sukses, data masuk ke database dan muncul log “Data user berhasil disimpan”. Jika gagal, akan keluar pesan error.
Sederhana, bukan? Begitu dasar cara menghubungkan Node.js dengan MongoDB menggunakan Mongoose.
3.3. Menjalankan dan Menguji
Untuk menjalankan aplikasi, cukup ketik di terminal:
node app.js
Jika semua konfigurasi benar, akan muncul log “Terhubung ke MongoDB dengan sukses!” dan “Data user berhasil disimpan: ...” di terminal, lalu data akan masuk ke koleksi users
di database MongoDB-mu.
Jika menggunakan Atlas, pastikan username, password, dan nama database yang kamu cantumkan dalam string koneksi sudah benar. Kadang, kita juga perlu mengizinkan IP address kita di bagian Network Access di dashboard MongoDB Atlas.
3.4. Tips dan Praktik Terbaik
- Penggunaan
.env
: Jangan hardcode username, password, atau string koneksi di dalam kode. Biasakan menyimpan informasi sensitif ini di file.env
. - Error Handling Lebih Baik: Gunakan try-catch atau middleware agar error dapat ditangani lebih rapi.
- Struktur Proyek Terorganisir: Pisahkan file koneksi database, definisi model, dan fungsi business logic. Jangan semuanya dijadikan satu file.
- Validasi Data: Mongoose memungkinkan kita menambahkan validator di level schema, misalnya validasi email. Ini meminimalisir data invalid masuk ke database.
4. Menghubungkan Node.js dengan MySQL
4.1. Sekilas Tentang MySQL
MySQL adalah salah satu relational database management system (RDBMS) paling populer di dunia. Ia menggunakan struktur tabel dengan baris dan kolom, mendukung bahasa SQL (Structured Query Language). Cocok untuk data yang relatif terstruktur dan memiliki relasi yang jelas.
Untuk bisa menggunakan MySQL, kita perlu menginstal MySQL Server (community edition) di komputer kita, atau kita dapat memakai layanan cloud seperti Amazon RDS, Google Cloud SQL, Azure Database for MySQL, dan sebagainya.
4.2. Persiapan MySQL
-
Instalasi MySQL Server (Jika Lokal)
Unduh installer MySQL Community Edition dari https://dev.mysql.com/downloads/. Setelah diinstal, buat user dan password. Default user biasanyaroot
. -
Buat Database
Misalnya, kita buat database bernamatest_db
. Kita bisa melakukannya lewat MySQL CLI atau tool seperti phpMyAdmin, MySQL Workbench, dan sejenisnya:CREATE DATABASE test_db; USE test_db;
Selanjutnya, kita bisa membuat tabel, contohnya:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(50) NOT NULL, age INT );
-
Siapkan Koneksi
Pastikan kita tahu host (default:localhost
), port (default:3306
), username (misalroot
), password (misal1234
), dan nama database (test_db
).
4.3. Koneksi Dasar Menggunakan mysql2
4.3.1. Instalasi Paket
Di folder proyek Node.js kita, jalankan:
npm install mysql2
4.3.2. Kode Contoh
Buat atau edit app.js
untuk menambahkan kode berikut:
const mysql = require('mysql2');
// Konfigurasi koneksi
const connection = mysql.createConnection({
host: 'localhost',
user: 'root', // ganti sesuai usermu
password: '1234', // ganti sesuai passwordmu
database: 'test_db', // ganti sesuai nama database
});
// Membuat koneksi
connection.connect((err) => {
if (err) {
console.error('Gagal terhubung ke MySQL:', err);
return;
}
console.log('Terhubung ke MySQL dengan sukses!');
});
// Contoh insert data
const sqlInsert = 'INSERT INTO users (name, email, age) VALUES (?, ?, ?)';
const values = ['Andi', 'andi@example.com', 30];
connection.query(sqlInsert, values, (err, results) => {
if (err) {
console.error('Gagal menyimpan data:', err);
return;
}
console.log('Data berhasil disimpan, ID:', results.insertId);
});
// Contoh select data
const sqlSelect = 'SELECT * FROM users';
connection.query(sqlSelect, (err, rows) => {
if (err) {
console.error('Gagal mengambil data:', err);
return;
}
console.log('Data users:', rows);
});
// Menutup koneksi (opsional, tergantung skenario)
connection.end((err) => {
if (err) {
console.error('Error saat menutup koneksi:', err);
return;
}
console.log('Koneksi MySQL ditutup.');
});
Penjelasan singkat:
- Kita membuat objek
connection
dengan konfigurasi host, user, password, dan nama database. - Kita panggil
connection.connect(...)
untuk memulai koneksi. - Kita jalankan query
INSERT
untuk memasukkan data “Andi”. - Lalu kita jalankan query
SELECT
untuk mengambil semua data dari tabelusers
. - Setelah itu, kita menutup koneksi dengan
connection.end(...)
.
Jika kita menjalankan node app.js
, seharusnya muncul log:
Terhubung ke MySQL dengan sukses!
Data berhasil disimpan, ID: 1
Data users: [
{
id: 1,
name: 'Andi',
email: 'andi@example.com',
age: 30
}
]
Koneksi MySQL ditutup.
Database pun akan berisi satu baris data baru di tabel users
.
4.4. Menggunakan Pool Koneksi
Dalam produksi, lebih disarankan untuk menggunakan connection pool daripada single connection. Pool memungkinkan kita memiliki sejumlah koneksi siap pakai yang dapat digunakan secara bersamaan, sehingga performa aplikasi lebih baik.
Contoh implementasi connection pool:
const mysql = require('mysql2');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '1234',
database: 'test_db',
connectionLimit: 10 // jumlah koneksi maksimum
});
pool.query('SELECT * FROM users', (err, rows) => {
if (err) {
return console.error('Gagal mengambil data:', err);
}
console.log('Data users dari pool:', rows);
});
Dengan pool, kita tidak perlu lagi memanggil connect()
dan end()
. Setiap kali kita butuh menjalankan query, pool akan mengelola koneksi di belakang layar.
4.5. ORM: Sequelize
Untuk aplikasi yang lebih kompleks, kita mungkin akan lebih nyaman menggunakan ORM seperti Sequelize. ORM membantu kita menuliskan kode manipulasi data (CRUD) tanpa harus menulis query SQL secara langsung setiap saat.
4.5.1. Instalasi
npm install sequelize mysql2
4.5.2. Kode Contoh
Berikut contoh singkat penggunaan Sequelize untuk MySQL:
const { Sequelize, DataTypes } = require('sequelize');
// Membuat instance Sequelize
const sequelize = new Sequelize('test_db', 'root', '1234', {
host: 'localhost',
dialect: 'mysql'
});
// Definisikan model User
const User = sequelize.define('User', {
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false
},
age: {
type: DataTypes.INTEGER
}
}, {
tableName: 'users' // pastikan sama dengan nama tabel di database
});
// Sinkronisasi model dengan database
sequelize.sync()
.then(() => {
console.log('Database & tables created!');
// Contoh menambahkan data
return User.create({
name: 'Sinta',
email: 'sinta@example.com',
age: 28
});
})
.then((newUser) => {
console.log('User baru:', newUser.toJSON());
// Contoh mengambil semua data
return User.findAll();
})
.then((allUsers) => {
console.log('Semua user:', allUsers.map(u => u.toJSON()));
})
.catch(err => {
console.error('Terjadi kesalahan:', err);
});
Dalam potongan kode di atas:
- Kita membuat instance Sequelize dengan konfigurasi database.
- Kita mendefinisikan model
User
yang merepresentasikan tabelusers
. sequelize.sync()
akan menyesuaikan (sync) struktur model dengan tabel di database (membuat tabel kalau belum ada, mengupdate struktur kalau diperlukan).- Kita menambahkan data baru dengan
User.create(...)
, lalu mengambil seluruh data denganUser.findAll()
.
ORM semacam ini memudahkan manajemen database ketika aplikasi menjadi lebih besar. Kita pun bisa berpindah ke database lain yang didukung Sequelize (misal PostgreSQL) hanya dengan mengubah konfigurasi dialect
dan driver yang diperlukan.
5. Mengelola Variabel Lingkungan (Environment Variables)
Saat menghubungkan Node.js dengan database, kita seringkali perlu menyimpan informasi sensitif seperti username, password, atau string koneksi. Jangan pernah mendorong (push) data ini ke repositori publik. Solusinya adalah menggunakan file .env
.
- Instalasi
dotenv
npm install dotenv
- Buat file
.env
Di root proyek, buat file.env
:DB_HOST=localhost DB_USER=root DB_PASS=1234 DB_NAME=test_db
MONGO_URI=mongodb+srv://username:password@cluster0.abcde.mongodb.net/mydatabase
- Impor
dotenv
diapp.js
(atau di file utama)require('dotenv').config();
- Akses variabel environment
const mysql = require('mysql2'); const connection = mysql.createConnection({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, });
- .gitignore
Pastikan file.env
dicantumkan dalam.gitignore
agar tidak ter-upload ke repository publik.
Dengan cara ini, kita bisa menjaga keamanan kredensial database kita.
6. Error Handling dan Logging
6.1. Error Handling
Kedua jenis database tersebut (MongoDB dan MySQL) tentunya bisa mengalami error. Dalam Node.js, penanganan error bisa dilakukan dengan:
- Callback function yang memiliki parameter
err
. - Promise dengan
.catch()
. - Async-await dengan
try-catch
.
Contoh pendekatan async-await:
const getAllUsers = async () => {
try {
const [rows] = await pool.query('SELECT * FROM users');
return rows;
} catch (err) {
console.error('Error saat mengambil data:', err);
throw err;
}
};
Dengan async-await, kode kita terlihat lebih bersih dan mudah diikuti.
6.2. Logging
Untuk logging, selain console.log()
, kita bisa menggunakan library seperti winston
atau morgan
(biasanya untuk HTTP request logging). Dengan logging yang rapi, kita bisa memantau aktivitas dan error di aplikasi dengan lebih efektif.
7. Struktur Proyek yang Lebih Baik
Dalam proyek real-world, kita biasanya tidak menulis semua kode dalam satu file app.js
saja. Kita akan membaginya menjadi folder dan file yang terorganisir:
- config: berisi file konfigurasi, misalnya
db.js
untuk inisiasi koneksi database. - models: berisi definisi model (MongoDB Mongoose atau Sequelize, tergantung selera).
- controllers: berisi fungsi-fungsi yang meng-handle logic untuk setiap route/ endpoint.
- routes: berisi deklarasi route aplikasi, contoh
users.js
untuk user-related endpoints. - app.js atau server.js: berisi setup Express (jika menggunakan Express) dan mempersiapkan server agar dapat diakses.
Contoh struktur direktori:
project-database/
├─ config/
│ └─ db.js
├─ models/
│ └─ userModel.js
├─ routes/
│ └─ userRoutes.js
├─ controllers/
│ └─ userController.js
├─ app.js
├─ package.json
├─ .env
└─ .gitignore
Dalam db.js
, kita hanya fokus pada konfigurasi dan koneksi ke database. Di userModel.js
, kita definisikan schema atau model user. Di userController.js
, kita tulis fungsi untuk CRUD user. Di userRoutes.js
, kita definisikan endpoint HTTP seperti GET /users
, POST /users
, dsb. Lalu di app.js
, kita memanggil route tersebut dan menyalakannya dengan server (misalnya Express).
8. Beberapa Pertimbangan Tambahan
-
Keamanan
- Gunakan enkripsi SSL/TLS jika database mendukungnya (sering kali default di cloud services).
- Batasi IP yang bisa terhubung ke database (firewall atau pengaturan whitelisting).
-
Optimasi Performansi
- Untuk MongoDB, pastikan membuat index di field yang sering digunakan pada query.
- Untuk MySQL, normalisasi database jika butuh integritas data yang kuat, atau lakukan indexing di kolom yang sering di-filter.
- Gunakan connection pool untuk MySQL, dan re-use connection di MongoDB.
-
Pemilihan Database
- MongoDB cocok kalau struktur datamu dinamis, skema bisa berubah, dan kamu butuh fleksibilitas tinggi.
- MySQL cocok kalau datamu sangat terstruktur, butuh integritas kuat (ACID), dan sering melakukan join antar-tabel.
- Tidak jarang, aplikasi besar memadukan kedua jenis database sesuai kebutuhan masing-masing modul.
-
Pencadangan (Backup)
- Pastikan memiliki mekanisme backup database secara rutin, baik snapshot di MongoDB Atlas atau backup file .sql di MySQL.
-
Migration
- Di MySQL/SQL Database, perubahan skema tabel sering dikelola lewat migration tools atau ORM.
- Di MongoDB, banyak tim yang mengatur perubahan schema “on-the-fly” atau memanfaatkan library khusus untuk migration.
-
Monitoring
- Gunakan tools seperti PM2 atau Forever untuk menjalankan aplikasi Node.js di server.
- Monitor penggunaan resource database, catat query lambat, dan optimasi jika diperlukan.
9. Contoh Skenario Singkat REST API Sederhana
Banyak pengembang menggunakan Node.js untuk membuat REST API yang terhubung dengan database. Misalnya, kita membuat API CRUD untuk user. Gambaran singkat (menggunakan Express):
9.1. Instalasi Express
npm install express
9.2. File app.js
const express = require('express');
const mysql = require('mysql2');
const app = express();
app.use(express.json());
// Buat koneksi pool MySQL
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '1234',
database: 'test_db',
connectionLimit: 10
});
// Endpoint GET /users
app.get('/users', (req, res) => {
pool.query('SELECT * FROM users', (err, rows) => {
if (err) {
return res.status(500).json({ error: err.message });
}
res.json(rows);
});
});
// Endpoint POST /users
app.post('/users', (req, res) => {
const { name, email, age } = req.body;
const sqlInsert = 'INSERT INTO users (name, email, age) VALUES (?, ?, ?)';
pool.query(sqlInsert, [name, email, age], (err, results) => {
if (err) {
return res.status(500).json({ error: err.message });
}
res.json({ id: results.insertId, name, email, age });
});
});
// Jalankan server
app.listen(3000, () => {
console.log('Server berjalan di port 3000');
});
Setelah itu, kita bisa uji menggunakan tool seperti Postman atau cURL:
- GET
http://localhost:3000/users
akan mengembalikan data user. - POST
http://localhost:3000/users
dengan JSON body{ "name": "Ani", "email": "ani@example.com", "age": 24 }
akan menambah data user ke database.
Tentu saja, kita bisa melakukan hal serupa dengan MongoDB. Caranya mirip; bedanya kita akan menulis query Mongoose di route handler, misalnya User.find()
untuk GET, User.create()
untuk POST, dan seterusnya.
Baca Juga :