Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Backend Node.js dengan Prisma, Express, dan SQLite

Dokumentasi lengkap pembuatan backend API RESTful dengan Node.js, Express, Prisma ORM, dan SQLite.

📋 Daftar Isi

🔧 Prasyarat

  • Node.js (v16 atau lebih tinggi)
  • npm atau yarn
  • Postman atau REST Client untuk testing API
  • Text Editor (VS Code, Sublime, dll)

📝 Langkah-langkah Setup

STEP 1 — Inisialisasi Project

cd C:\xampp\htdocs\backend-nodeJS
npm init -y

STEP 2 — Install Dependencies

npm install express cors dotenv helmet express-rate-limit zod pino pino-pretty
npm install -D prisma nodemon

Penjelasan dependencies:

  • express - Framework web
  • cors - Menangani Cross-Origin Requests
  • dotenv - Manajemen environment variables
  • helmet - Security middleware
  • express-rate-limit - Rate limiting untuk API
  • zod - Validasi schema
  • pino - Logger untuk production
  • prisma - ORM database
  • nodemon - Auto-reload saat development

STEP 3 — Setup Environment Variables

Buat file .env di root project:

DATABASE_URL="file:./dev.db"
PORT=3000
NODE_ENV=development
CORS_ORIGIN=http://localhost:3000
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100
LOG_LEVEL=info

STEP 4 — Inisialisasi Prisma

npx prisma init

STEP 5 — Setup Prisma Schema

Edit prisma/schema.prisma:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String
  phone     String?
  address   String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Product {
  id          Int      @id @default(autoincrement())
  name        String
  description String?
  price       Float
  stock       Int      @default(0)
  category    String?
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
}

STEP 6 — Jalankan Prisma Migration

npx prisma migrate dev --name init

Perintah ini akan:

  • Membuat file database dev.db
  • Membuat folder prisma/migrations
  • Generate Prisma Client

STEP 7 — Setup Prisma Client

Buat file src/config/database.js:

const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient();

module.exports = prisma;

STEP 8 — Buat Schema Validasi (Zod)

File: src/schemas/userSchema.js

const { z } = require('zod');

exports.userSchema = z.object({
  email: z.string().email(),
  name: z.string().min(3),
  phone: z.string().optional(),
  address: z.string().optional()
});

File: src/schemas/productSchema.js

const { z } = require('zod');

exports.productSchema = z.object({
  name: z.string(),
  price: z.number(),
  stock: z.number(),
  description: z.string().optional(),
  category: z.string().optional()
});

STEP 9 — Buat Controller

File: src/controllers/userController.js

const prisma = require('../config/database');

exports.getAllUsers = async (req, res) => {
  const users = await prisma.user.findMany();
  res.json(users);
};

exports.getUserById = async (req, res) => {
  const user = await prisma.user.findUnique({
    where: { id: Number(req.params.id) }
  });
  if (!user) return res.status(404).json({ message: 'User tidak ditemukan' });
  res.json(user);
};

exports.createUser = async (req, res) => {
  const user = await prisma.user.create({ data: req.body });
  res.status(201).json(user);
};

exports.updateUser = async (req, res) => {
  const user = await prisma.user.update({
    where: { id: Number(req.params.id) },
    data: req.body
  });
  res.json(user);
};

exports.deleteUser = async (req, res) => {
  await prisma.user.delete({
    where: { id: Number(req.params.id) }
  });
  res.json({ message: 'User dihapus' });
};

File: src/controllers/productController.js

const prisma = require('../config/database');

exports.getAllProducts = async (req, res) => {
  const data = await prisma.product.findMany();
  res.json(data);
};

exports.getProductById = async (req, res) => {
  const data = await prisma.product.findUnique({
    where: { id: Number(req.params.id) }
  });
  if (!data) return res.status(404).json({ message: 'Product tidak ditemukan' });
  res.json(data);
};

exports.createProduct = async (req, res) => {
  const data = await prisma.product.create({ data: req.body });
  res.status(201).json(data);
};

exports.updateProduct = async (req, res) => {
  const data = await prisma.product.update({
    where: { id: Number(req.params.id) },
    data: req.body
  });
  res.json(data);
};

exports.deleteProduct = async (req, res) => {
  await prisma.product.delete({
    where: { id: Number(req.params.id) }
  });
  res.json({ message: 'Product dihapus' });
};

STEP 10 — Buat Routes

File: src/routes/userRoutes.js

const express = require('express');
const router = express.Router();
const controller = require('../controllers/userController');

router.get('/', controller.getAllUsers);
router.get('/:id', controller.getUserById);
router.post('/', controller.createUser);
router.put('/:id', controller.updateUser);
router.delete('/:id', controller.deleteUser);

module.exports = router;

File: src/routes/productRoutes.js

const express = require('express');
const router = express.Router();
const controller = require('../controllers/productController');

router.get('/', controller.getAllProducts);
router.get('/:id', controller.getProductById);
router.post('/', controller.createProduct);
router.put('/:id', controller.updateProduct);
router.delete('/:id', controller.deleteProduct);

module.exports = router;

STEP 11 — Setup Server Express

File: server.js

require('dotenv').config();
const express = require('express');
const helmet = require('helmet');
const cors = require('cors');
const rateLimit = require('express-rate-limit');

const app = express();

// Security
app.use(helmet());

// JSON reader
app.use(express.json());

// CORS
app.use(cors({
  origin: process.env.CORS_ORIGIN.split(',')
}));

// Rate limiter
app.use(rateLimit({
  windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS),
  max: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS)
}));

// Routes
app.use('/api/users', require('./src/routes/userRoutes'));
app.use('/api/products', require('./src/routes/productRoutes'));

// Health Check
app.get('/api/health', (req, res) => {
  res.json({ status: 'OK', message: 'Server berjalan' });
});

// Global Error Handler
app.use((err, req, res, next) => {
  res.status(500).json({
    message: 'Internal Server Error',
    error: err.message
  });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running di http://localhost:${PORT}`);
});

STEP 12 — Update package.json Scripts

Edit package.json dan tambahkan scripts:

"scripts": {
  "start": "node server.js",
  "dev": "nodemon server.js",
  "prisma:migrate": "npx prisma migrate dev",
  "prisma:studio": "npx prisma studio"
}

STEP 13 — Jalankan Server

npm run dev

Output yang diharapkan:

Server running di http://localhost:3000

📁 Struktur Folder

backend-nodeJS/
├── prisma/
│   ├── schema.prisma
│   └── migrations/
├── src/
│   ├── config/
│   │   └── database.js
│   ├── controllers/
│   │   ├── userController.js
│   │   └── productController.js
│   ├── routes/
│   │   ├── userRoutes.js
│   │   └── productRoutes.js
│   └── schemas/
│       ├── userSchema.js
│       └── productSchema.js
├── .env
├── .gitignore
├── package.json
├── prisma.config.ts
├── server.js
└── dev.db (database file)

🔌 API Endpoints

Health Check

  • GET /api/health - Check server status

Users

  • GET /api/users - Get all users
  • GET /api/users/:id - Get user by ID
  • POST /api/users - Create new user
  • PUT /api/users/:id - Update user
  • DELETE /api/users/:id - Delete user

Products

  • GET /api/products - Get all products
  • GET /api/products/:id - Get product by ID
  • POST /api/products - Create new product
  • PUT /api/products/:id - Update product
  • DELETE /api/products/:id - Delete product

🧪 Testing

1. Health Check (Browser)

Buka: http://localhost:3000/api/health

Response:

{
  "status": "OK",
  "message": "Server berjalan"
}

2. Testing dengan Postman

Create User

  • Method: POST
  • URL: http://localhost:3000/api/users
  • Body (JSON):
{
  "email": "user@example.com",
  "name": "John Doe",
  "phone": "08123456789",
  "address": "Jl. Merdeka No. 1"
}

Get All Users

  • Method: GET
  • URL: http://localhost:3000/api/users

Get User by ID

  • Method: GET
  • URL: http://localhost:3000/api/users/1

Update User

  • Method: PUT
  • URL: http://localhost:3000/api/users/1
  • Body (JSON):
{
  "name": "Jane Doe",
  "phone": "08987654321"
}

Delete User

  • Method: DELETE
  • URL: http://localhost:3000/api/users/1

3. View Database dengan Prisma Studio

npm run prisma:studio

Akan membuka UI di browser untuk melihat dan mengedit data database secara visual.

📚 Commands Penting

# Development
npm run dev                 # Run server dengan nodemon

# Production
npm start                   # Run server

# Database
npm run prisma:migrate      # Run migration
npm run prisma:studio       # Open Prisma Studio

# Prisma
npx prisma generate         # Generate Prisma Client
npx prisma db push          # Push schema ke database

🔐 Security Best Practices

  1. Environment Variables - Semua sensitive data di .env
  2. Helmet.js - Protect HTTP headers
  3. CORS - Kontrol akses cross-origin
  4. Rate Limiting - Prevent DDoS attacks
  5. Input Validation - Gunakan Zod untuk validasi

🐛 Troubleshooting

Error: Cannot find module '@prisma/client'

npm install @prisma/client
npx prisma generate

Database lock error

# Delete dan regenerate database
rm prisma/dev.db
npx prisma migrate dev --name init

Port already in use

Ubah PORT di .env atau gunakan:

PORT=3001 npm run dev

📄 License

MIT

👨‍💻 Author

Backend Node.js Setup Guide - 2025

About

Simple REST API using Node.js, Express, and Prisma ORM with SQLite database. This project demonstrates CRUD operations for Users and Products, equipped with security middleware, request validation, and global error handling. Built for learning backend development and RESTful API implementation.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages