Back to Blogtutorial

Cara Membuat REST API dengan Node.js dan Express

Metro New Technology
January 2, 2024
4 min read
nodejsexpressapibackend
Cara Membuat REST API dengan Node.js dan Express

Cara Membuat REST API dengan Node.js dan Express

REST API adalah jembatan antara frontend dan database. Di tutorial ini, kita akan membuat API lengkap untuk aplikasi Todo List.

Prerequisites

  • Node.js terinstall
  • Pemahaman dasar JavaScript
  • Postman atau tool API testing

Setup Project

# Buat folder project
mkdir todo-api
cd todo-api

# Initialize npm
npm init -y

# Install dependencies
npm install express cors dotenv

# Install dev dependencies
npm install -D nodemon

Struktur Folder

todo-api/
├── src/
│   ├── routes/
│   │   └── todos.js
│   ├── controllers/
│   │   └── todoController.js
│   ├── middleware/
│   │   └── errorHandler.js
│   └── index.js
├── package.json
└── .env

Buat Server Basic

// src/index.js
const express = require('express');
const cors = require('cors');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;

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

// Health check
app.get('/', (req, res) => {
  res.json({ message: 'Todo API is running!' });
});

// Start server
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
// package.json - tambahkan scripts
{
  "scripts": {
    "start": "node src/index.js",
    "dev": "nodemon src/index.js"
  }
}

Buat Routes dan Controller

Controller

// src/controllers/todoController.js

// Simulated database
let todos = [
  { id: 1, title: 'Belajar Node.js', completed: false },
  { id: 2, title: 'Buat REST API', completed: false },
];

// Get all todos
exports.getAllTodos = (req, res) => {
  res.json({
    success: true,
    data: todos,
    count: todos.length
  });
};

// Get single todo
exports.getTodoById = (req, res) => {
  const { id } = req.params;
  const todo = todos.find(t => t.id === parseInt(id));
  
  if (!todo) {
    return res.status(404).json({
      success: false,
      message: 'Todo not found'
    });
  }
  
  res.json({ success: true, data: todo });
};

// Create todo
exports.createTodo = (req, res) => {
  const { title } = req.body;
  
  if (!title) {
    return res.status(400).json({
      success: false,
      message: 'Title is required'
    });
  }
  
  const newTodo = {
    id: todos.length + 1,
    title,
    completed: false
  };
  
  todos.push(newTodo);
  
  res.status(201).json({
    success: true,
    data: newTodo
  });
};

// Update todo
exports.updateTodo = (req, res) => {
  const { id } = req.params;
  const { title, completed } = req.body;
  
  const todoIndex = todos.findIndex(t => t.id === parseInt(id));
  
  if (todoIndex === -1) {
    return res.status(404).json({
      success: false,
      message: 'Todo not found'
    });
  }
  
  todos[todoIndex] = {
    ...todos[todoIndex],
    title: title || todos[todoIndex].title,
    completed: completed !== undefined ? completed : todos[todoIndex].completed
  };
  
  res.json({
    success: true,
    data: todos[todoIndex]
  });
};

// Delete todo
exports.deleteTodo = (req, res) => {
  const { id } = req.params;
  const todoIndex = todos.findIndex(t => t.id === parseInt(id));
  
  if (todoIndex === -1) {
    return res.status(404).json({
      success: false,
      message: 'Todo not found'
    });
  }
  
  todos.splice(todoIndex, 1);
  
  res.json({
    success: true,
    message: 'Todo deleted successfully'
  });
};

Routes

// src/routes/todos.js
const express = require('express');
const router = express.Router();
const todoController = require('../controllers/todoController');

router.get('/', todoController.getAllTodos);
router.get('/:id', todoController.getTodoById);
router.post('/', todoController.createTodo);
router.put('/:id', todoController.updateTodo);
router.delete('/:id', todoController.deleteTodo);

module.exports = router;

Update index.js

// src/index.js - tambahkan routes
const todoRoutes = require('./routes/todos');

// ... middleware setup

// Routes
app.use('/api/todos', todoRoutes);

// ... start server

Error Handling Middleware

// src/middleware/errorHandler.js
const errorHandler = (err, req, res, next) => {
  console.error(err.stack);
  
  res.status(err.status || 500).json({
    success: false,
    message: err.message || 'Internal Server Error'
  });
};

module.exports = errorHandler;

Testing dengan Postman

GET All Todos

GET http://localhost:3000/api/todos

GET Single Todo

GET http://localhost:3000/api/todos/1

POST Create Todo

POST http://localhost:3000/api/todos
Content-Type: application/json

{
  "title": "Belajar REST API"
}

PUT Update Todo

PUT http://localhost:3000/api/todos/1
Content-Type: application/json

{
  "completed": true
}

DELETE Todo

DELETE http://localhost:3000/api/todos/1

Best Practices

  1. Selalu gunakan status code yang tepat

    • 200: Success
    • 201: Created
    • 400: Bad Request
    • 404: Not Found
    • 500: Internal Server Error
  2. Struktur response konsisten

    {
      "success": true/false,
      "data": {},
      "message": "Optional message"
    }
    
  3. Validasi input

  4. Gunakan environment variables

  5. Implement logging

Kesimpulan

Anda sudah belajar cara membuat REST API sederhana dengan Node.js dan Express. API ini bisa dikembangkan dengan menambahkan:

  • Database (MongoDB/PostgreSQL)
  • Authentication (JWT)
  • Validation (Joi/Zod)
  • Rate limiting
  • API documentation (Swagger)

Happy coding! 🚀

Share this article

Iklan