Thursday

19-06-2025 Vol 19

Connect a React App with MongoDB using Node.js and Express.js

Cara Menghubungkan Aplikasi React dengan MongoDB menggunakan Node.js dan Express.js

Panduan langkah demi langkah ini akan memandu Anda melalui proses integrasi aplikasi React front-end dengan database MongoDB menggunakan server Node.js dan kerangka kerja Express.js. Kami akan membahas penyiapan proyek, pembuatan API, koneksi ke MongoDB, dan menampilkan data dari database di aplikasi React Anda. Tutorial ini ditujukan bagi pengembang yang memiliki pemahaman dasar tentang React, Node.js, Express.js, dan MongoDB.

Daftar Isi

  1. Pendahuluan
  2. Prasyarat
  3. Menyiapkan Proyek Node.js dengan Express
  4. Menghubungkan ke MongoDB dengan Mongoose
  5. Membuat Model MongoDB
  6. Membuat Rute API dengan Express
  7. Menyiapkan Aplikasi React
  8. Mengambil Data dari API di React
  9. Menampilkan Data di Komponen React
  10. Penanganan Kesalahan
  11. Pertimbangan Keamanan
  12. Optimasi Performa
  13. Kesimpulan

1. Pendahuluan

Dalam pengembangan web modern, adalah hal yang umum untuk memisahkan front-end dan back-end aplikasi. React adalah perpustakaan JavaScript yang populer untuk membangun antarmuka pengguna yang dinamis dan interaktif. Node.js, bersama dengan Express.js, menyediakan lingkungan back-end yang kuat untuk menangani logika sisi server, API, dan interaksi database. MongoDB adalah database NoSQL yang fleksibel dan dapat diskalakan yang sering digunakan dengan Node.js. Artikel ini akan menunjukkan cara menyatukan teknologi-teknologi ini untuk membuat aplikasi web lengkap.

2. Prasyarat

Sebelum memulai, pastikan Anda telah menginstal prasyarat berikut:

  • Node.js dan npm (Node Package Manager)
  • MongoDB (baik secara lokal atau menggunakan layanan cloud seperti MongoDB Atlas)
  • Editor kode (seperti Visual Studio Code, Sublime Text, atau Atom)
  • Pemahaman dasar tentang JavaScript, React, Node.js, Express.js, dan MongoDB

3. Menyiapkan Proyek Node.js dengan Express

Pertama, kita akan membuat proyek Node.js dan menginstal Express.js:

  1. Buat Direktori Proyek: Buka terminal atau command prompt Anda dan buat direktori baru untuk proyek Anda:
    mkdir react-mongo-app
    cd react-mongo-app
  2. Inisialisasi Proyek Node.js: Inisialisasi proyek Node.js baru dengan menjalankan perintah berikut:
    npm init -y

    Ini akan membuat file package.json dengan konfigurasi default.

  3. Instal Express.js: Instal Express.js sebagai dependensi proyek Anda:
    npm install express cors
  4. Buat File index.js: Buat file bernama index.js di direktori proyek Anda. Ini akan menjadi titik masuk untuk server Anda.

Berikut adalah contoh dasar dari file index.js:

const express = require('express');
const cors = require('cors');
const app = express();
const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json()); // untuk mengurai body JSON

app.get('/', (req, res) => {
  res.send('Server is running!');
});

app.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});

Penjelasan Kode:

  • require('express'): Mengimpor modul Express.js.
  • express(): Membuat instance aplikasi Express.
  • port: Mendefinisikan port yang akan didengarkan oleh server. Ini akan menggunakan variabel lingkungan PORT jika tersedia, jika tidak default ke 5000.
  • app.use(cors()): Mengaktifkan Cross-Origin Resource Sharing (CORS) untuk memungkinkan permintaan dari domain yang berbeda (aplikasi React Anda).
  • app.use(express.json()): Middleware untuk mengurai body permintaan JSON.
  • app.get('/', ...): Mendefinisikan rute untuk jalur root (“/”). Saat pengunjung mengakses root, server akan mengirimkan respons “Server is running!”.
  • app.listen(port, ...): Memulai server dan membuatnya mendengarkan koneksi masuk pada port yang ditentukan.

Untuk menjalankan server, tambahkan skrip berikut ke file package.json Anda:

"scripts": {
  "start": "node index.js",
  "dev": "nodemon index.js"
}

Anda sekarang dapat menjalankan server menggunakan npm start (untuk menjalankan server) atau npm run dev (untuk menjalankan server dengan Nodemon, yang secara otomatis memulai ulang server saat Anda melakukan perubahan).

4. Menghubungkan ke MongoDB dengan Mongoose

Mongoose adalah Object Data Modeling (ODM) untuk MongoDB dan Node.js. Ini menyediakan cara langsung, berbasis skema untuk memodelkan data aplikasi Anda.

  1. Instal Mongoose: Instal Mongoose sebagai dependensi proyek Anda:
    npm install mongoose dotenv
  2. Buat File .env: Buat file bernama .env di direktori proyek Anda. Simpan URI koneksi MongoDB Anda di file ini. Ini akan menjaga informasi sensitif Anda tetap aman.
    MONGODB_URI=mongodb+srv://<username>:<password>@<cluster-url>/<database-name>?retryWrites=true&w=majority

    Ganti <username>, <password>, <cluster-url>, dan <database-name> dengan kredensial MongoDB Anda yang sebenarnya.

  3. Hubungkan ke MongoDB: Modifikasi file index.js Anda untuk terhubung ke MongoDB menggunakan Mongoose:
    const express = require('express');
    const cors = require('cors');
    const mongoose = require('mongoose');
    require('dotenv').config(); // Memuat variabel lingkungan dari file .env
    const app = express();
    const port = process.env.PORT || 5000;
    
    app.use(cors());
    app.use(express.json());
    
    // Konfigurasi koneksi MongoDB
    const uri = process.env.MONGODB_URI;
    mongoose.connect(uri, {
      useNewUrlParser: true,
      useUnifiedTopology: true
    })
    .then(() => console.log('Terhubung ke MongoDB!'))
    .catch(err => console.error('Koneksi MongoDB gagal:', err));
    
    app.get('/', (req, res) => {
      res.send('Server is running!');
    });
    
    app.listen(port, () => {
      console.log(`Server listening on port ${port}`);
    });

Penjelasan Kode:

  • require('mongoose'): Mengimpor modul Mongoose.
  • require('dotenv').config(): Memuat variabel lingkungan dari file .env ke dalam process.env.
  • uri: Mendapatkan URI koneksi MongoDB dari variabel lingkungan MONGODB_URI.
  • mongoose.connect(uri, ...): Menghubungkan ke MongoDB menggunakan URI yang diberikan. Opsi useNewUrlParser: true dan useUnifiedTopology: true memastikan koneksi menggunakan driver MongoDB terbaru.
  • .then(...): Menangani koneksi yang berhasil.
  • .catch(...): Menangani kesalahan koneksi.

5. Membuat Model MongoDB

Model Mongoose adalah representasi skema data dalam database MongoDB Anda. Misalnya, jika Anda menyimpan daftar tugas, Anda akan membuat model untuk mewakili setiap tugas.

  1. Buat Direktori models: Buat direktori bernama models di dalam direktori proyek Anda.
  2. Buat File Model: Di dalam direktori models, buat file bernama task.model.js (atau nama yang sesuai dengan data Anda).

Berikut adalah contoh model untuk tugas:

const mongoose = require('mongoose');

const taskSchema = new mongoose.Schema({
  description: {
    type: String,
    required: true
  },
  completed: {
    type: Boolean,
    default: false
  }
}, {
  timestamps: true // Secara otomatis menambahkan bidang createdAt dan updatedAt
});

const Task = mongoose.model('Task', taskSchema);

module.exports = Task;

Penjelasan Kode:

  • require('mongoose'): Mengimpor modul Mongoose.
  • taskSchema: Mendefinisikan skema untuk dokumen Tugas.
    • description: Bidang String yang diperlukan.
    • completed: Bidang Boolean dengan nilai default false.
  • timestamps: true: Opsi untuk secara otomatis menambahkan bidang createdAt dan updatedAt ke setiap dokumen.
  • mongoose.model('Task', taskSchema): Membuat model Mongoose bernama ‘Task’ berdasarkan skema yang ditentukan.
  • module.exports = Task: Mengekspor model Tugas untuk digunakan di bagian lain aplikasi.

6. Membuat Rute API dengan Express

Sekarang kita akan membuat rute API menggunakan Express.js untuk melakukan operasi CRUD (Create, Read, Update, Delete) pada data Tugas di MongoDB.

  1. Buat Direktori routes: Buat direktori bernama routes di dalam direktori proyek Anda.
  2. Buat File Rute: Di dalam direktori routes, buat file bernama tasks.route.js.

Berikut adalah contoh rute untuk Tugas:

const express = require('express');
const router = express.Router();
const Task = require('../models/task.model');

// Mendapatkan semua tugas
router.get('/', async (req, res) => {
  try {
    const tasks = await Task.find();
    res.json(tasks);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

// Mendapatkan satu tugas berdasarkan ID
router.get('/:id', async (req, res) => {
  try {
    const task = await Task.findById(req.params.id);
    if (!task) {
      return res.status(404).json({ message: 'Tugas tidak ditemukan' });
    }
    res.json(task);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

// Membuat tugas baru
router.post('/', async (req, res) => {
  const task = new Task({
    description: req.body.description,
    completed: req.body.completed
  });

  try {
    const newTask = await task.save();
    res.status(201).json(newTask);
  } catch (err) {
    res.status(400).json({ message: err.message });
  }
});

// Memperbarui tugas
router.patch('/:id', async (req, res) => {
  try {
    const task = await Task.findById(req.params.id);
    if (!task) {
      return res.status(404).json({ message: 'Tugas tidak ditemukan' });
    }

    if (req.body.description != null) {
      task.description = req.body.description;
    }
    if (req.body.completed != null) {
      task.completed = req.body.completed;
    }

    const updatedTask = await task.save();
    res.json(updatedTask);
  } catch (err) {
    res.status(400).json({ message: err.message });
  }
});

// Menghapus tugas
router.delete('/:id', async (req, res) => {
  try {
    const task = await Task.findById(req.params.id);
    if (!task) {
      return res.status(404).json({ message: 'Tugas tidak ditemukan' });
    }

    await task.remove();
    res.json({ message: 'Tugas dihapus' });
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

module.exports = router;

Penjelasan Kode:

  • require('express'): Mengimpor modul Express.
  • express.Router(): Membuat instance router Express.
  • require('../models/task.model'): Mengimpor model Tugas yang kita buat sebelumnya.
  • router.get('/', ...): Menangani permintaan GET ke /tasks untuk mendapatkan semua tugas.
  • router.get('/:id', ...): Menangani permintaan GET ke /tasks/:id untuk mendapatkan satu tugas berdasarkan ID.
  • router.post('/', ...): Menangani permintaan POST ke /tasks untuk membuat tugas baru.
  • router.patch('/:id', ...): Menangani permintaan PATCH ke /tasks/:id untuk memperbarui tugas yang ada.
  • router.delete('/:id', ...): Menangani permintaan DELETE ke /tasks/:id untuk menghapus tugas.
  • async/await: Digunakan untuk menangani operasi asinkron (seperti kueri database) dengan lebih bersih.
  • try/catch: Digunakan untuk menangani kesalahan dan mengirim respons kesalahan yang sesuai.

Sekarang, integrasikan rute ini ke dalam file index.js Anda:

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json());

const uri = process.env.MONGODB_URI;
mongoose.connect(uri, {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
.then(() => console.log('Terhubung ke MongoDB!'))
.catch(err => console.error('Koneksi MongoDB gagal:', err));

const tasksRouter = require('./routes/tasks.route');
app.use('/tasks', tasksRouter);

app.get('/', (req, res) => {
  res.send('Server is running!');
});

app.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});

Penjelasan Kode:

  • require('./routes/tasks.route'): Mengimpor router tugas.
  • app.use('/tasks', tasksRouter): Memasang router tugas pada jalur /tasks. Ini berarti bahwa semua rute yang didefinisikan dalam tasksRouter akan diawali dengan /tasks.

7. Menyiapkan Aplikasi React

Sekarang kita akan menyiapkan aplikasi React untuk berinteraksi dengan API kita. Jika Anda sudah memiliki aplikasi React, Anda dapat melewati langkah ini. Jika tidak, berikut cara membuat aplikasi React baru:

  1. Buat Aplikasi React: Gunakan Create React App untuk membuat aplikasi React baru:
    npx create-react-app client
    cd client
  2. Mulai Server Pengembangan: Mulai server pengembangan React:
    npm start

    Ini akan membuka aplikasi Anda di browser Anda (biasanya di http://localhost:3000).

8. Mengambil Data dari API di React

Kita akan menggunakan fetch API atau perpustakaan seperti Axios untuk mengambil data dari API Node.js kita.

  1. Instal Axios (Opsional): Jika Anda lebih suka menggunakan Axios, instal:
    npm install axios
  2. Modifikasi Komponen: Edit komponen React Anda (misalnya, src/App.js) untuk mengambil data dari API:
    import React, { useState, useEffect } from 'react';
    import axios from 'axios'; // Atau gunakan fetch
    
    function App() {
      const [tasks, setTasks] = useState([]);
    
      useEffect(() => {
        const fetchData = async () => {
          try {
            const result = await axios('http://localhost:5000/tasks'); // Ganti dengan URL server Anda
            setTasks(result.data);
          } catch (error) {
            console.error('Ada kesalahan!', error);
          }
        };
    
        fetchData();
      }, []); // Jalankan efek hanya sekali saat komponen dipasang
    
      return (
        <div>
          <h1>Daftar Tugas</h1>
          <ul>
            {tasks.map(task => (
              <li key={task._id}>
                {task.description} - {task.completed ? 'Selesai' : 'Belum Selesai'}
              </li>
            ))}
          </ul>
        </div>
      );
    }
    
    export default App;

Penjelasan Kode:

  • useState([]): Membuat state tasks untuk menyimpan daftar tugas, diinisialisasi sebagai array kosong.
  • useEffect(() => { ... }, []): Hook yang menjalankan efek setelah komponen dipasang. Array kosong [] sebagai argumen kedua memastikan efek hanya berjalan sekali.
  • fetchData: Fungsi asinkron yang mengambil data dari API.
  • axios('http://localhost:5000/tasks'): Menggunakan Axios untuk membuat permintaan GET ke API Anda.
  • setTasks(result.data): Memperbarui state tasks dengan data yang diterima dari API.
  • tasks.map(...): Mengulang daftar tugas dan merender setiap tugas sebagai item daftar (<li>).

9. Menampilkan Data di Komponen React

Di bagian sebelumnya, kita telah mengambil data dan menyimpannya di state tasks. Sekarang, kita akan menampilkan data ini di komponen React kita.

Kode yang disediakan di bagian sebelumnya sudah menampilkan data. Pastikan Anda memahami bagaimana data diloop dan dirender dalam JSX.

10. Penanganan Kesalahan

Penting untuk menangani kesalahan di aplikasi Anda, baik di back-end maupun front-end.

  • Back-end (Node.js/Express): Gunakan blok try/catch untuk menangkap kesalahan dan mengirim respons kesalahan yang bermakna ke klien. Lihat contoh di bagian rute API.
  • Front-end (React): Tangani kesalahan saat mengambil data dari API dan tampilkan pesan kesalahan yang sesuai kepada pengguna.
    import React, { useState, useEffect } from 'react';
    import axios from 'axios';
    
    function App() {
      const [tasks, setTasks] = useState([]);
      const [error, setError] = useState(null);
    
      useEffect(() => {
        const fetchData = async () => {
          try {
            const result = await axios('http://localhost:5000/tasks');
            setTasks(result.data);
          } catch (error) {
            console.error('Ada kesalahan!', error);
            setError('Gagal mengambil data. Silakan coba lagi nanti.');
          }
        };
    
        fetchData();
      }, []);
    
      return (
        <div>
          <h1>Daftar Tugas</h1>
          {error && <p style={{ color: 'red' }}>{error}</p>}
          <ul>
            {tasks.map(task => (
              <li key={task._id}>
                {task.description} - {task.completed ? 'Selesai' : 'Belum Selesai'}
              </li>
            ))}
          </ul>
        </div>
      );
    }
    
    export default App;

11. Pertimbangan Keamanan

Saat membangun aplikasi web, penting untuk mempertimbangkan keamanan.

  • Validasi Input: Selalu validasi input pengguna di back-end untuk mencegah serangan injeksi.
  • Otentikasi dan Otorisasi: Terapkan otentikasi dan otorisasi untuk melindungi API Anda dan memastikan hanya pengguna yang berwenang yang dapat mengakses data.
  • Lindungi Kredensial: Jangan pernah menyimpan kredensial database secara langsung di kode Anda. Gunakan variabel lingkungan atau sistem manajemen rahasia.
  • CORS: Konfigurasi CORS dengan hati-hati untuk membatasi asal mana yang diizinkan untuk mengakses API Anda.

12. Optimasi Performa

Berikut adalah beberapa tips untuk mengoptimalkan performa aplikasi Anda:

  • Pengindeksan Database: Gunakan indeks yang tepat di database MongoDB Anda untuk mempercepat kueri.
  • Pagination: Implementasikan pagination untuk menangani set data besar.
  • Caching: Gunakan caching untuk mengurangi jumlah panggilan database.
  • Bundling Front-end: Optimalkan bundel front-end Anda untuk mengurangi ukuran file dan meningkatkan waktu muat.

13. Kesimpulan

Dalam tutorial ini, kita telah membahas cara menghubungkan aplikasi React dengan database MongoDB menggunakan Node.js dan Express.js. Kita telah membahas penyiapan proyek, koneksi database, pembuatan API, dan menampilkan data di aplikasi React Anda. Dengan mengikuti langkah-langkah ini, Anda dapat membangun aplikasi web yang kuat dan dapat diskalakan menggunakan teknologi populer ini.

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *