Membangun aplikasi web di era modern memerlukan pondasi yang kokoh. Framework modern memberikan fleksibilitas luar biasa bagi developer untuk menghadirkan fitur kompleks secara cepat tanpa mengabaikan aspek keamanan dan keandalan sistem.
Tahapan Implementasi & Walkthrough Kode
Berikut adalah langkah demi langkah teknis yang dapat Anda ikuti langsung pada codebase Anda:
Tahap 1: Penulisan Kode & Konfigurasi
//import PrismaClient
const { PrismaClient } = require('@prisma/client');
//init prisma client
const prisma = new PrismaClient();
// Import validationResult from express-validator
const { validationResult } = require("express-validator");
//function findPosts
const findPosts = async (req, res) => {
try {
//get all posts from database
const posts = await prisma.post.findMany({
select: {
id: true,
title: true,
content: true,
createdAt: true,
updatedAt: true,
},
orderBy: {
createdAt: "desc",
},
});
//send response
res.status(200).send({
success: true,
message: "Get All Posts Successfully",
data: posts,
});
} catch (error) {
res.status(500).send({
success: false,
message: "Internal server error",
});
}
};
//function createPost
const createPost = async (req, res) => {
// Periksa hasil validasi
const errors = validationResult(req);
if (!errors.isEmpty()) {
// Jika ada error, kembalikan error ke pengguna
return res.status(422).json({
success: false,
message: "Validation error",
errors: errors.array(),
});
}
try {
//insert data
const post = await prisma.post.create({
data: {
title: req.body.title,
content: req.body.content,
},
});
res.status(201).send({
success: true,
message: "Post Created Successfully",
data: post,
});
} catch (error) {
res.status(500).send({
success: false,
message: "Internal server error",
});
}
};
//function findPostById
const findPostById = async (req, res) => {
//get ID from params
const { id } = req.params;
try {
//get post by ID
const post = await prisma.post.findUnique({
where: {
id: id,
},
select: {
id: true,
title: true,
content: true,
createdAt: true,
updatedAt: true,
},
});
//send response
res.status(200).send({
success: true,
message: `Get Post By ID :${id}`,
data: post,
});
} catch (error) {
res.status(500).send({
success: false,
message: "Internal server error",
});
}
};
//function updatePost
const updatePost = async (req, res) => {
//get ID from params
const { id } = req.params;
// Periksa hasil validasi
const errors = validationResult(req);
if (!errors.isEmpty()) {
// Jika ada error, kembalikan error ke pengguna
return res.status(422).json({
success: false,
message: "Validation error",
errors: errors.array(),
});
}
try {
//update post
const post = await prisma.post.update({
where: {
id: id,
},
data: {
title: req.body.title,
content: req.body.content,
updatedAt: new Date(),
},
});
//send response
res.status(200).send({
success: true,
message: 'Post Updated Successfully',
data: post,
});
} catch (error) {
res.status(500).send({
success: false,
message: "Internal server error",
});
}
};
//export function
module.exports = {
findPosts,
createPost,
findPostById,
updatePost,
}
Tahap 2: Penulisan Kode & Konfigurasi
//function updatePost
const updatePost = async (req, res) => {
//...
}
Tahap 3: Penulisan Kode & Konfigurasi
//get ID from params
const { id } = req.params;
Tahap 4: Penulisan Kode & Konfigurasi
// Periksa hasil validasi
const errors = validationResult(req);
Tahap 5: Penulisan Kode & Konfigurasi
// Jika ada error, kembalikan error ke pengguna
return res.status(422).json({
success: false,
message: "Validation error",
errors: errors.array(),
});
Tahap 6: Penulisan Kode & Konfigurasi
//update post
const post = await prisma.post.update({
where: {
id: id,
},
data: {
title: req.body.title,
content: req.body.content,
updatedAt: new Date(),
},
});
Tahap 7: Penulisan Kode & Konfigurasi
//send response
res.status(200).send({
success: true,
message: 'Post Updated Successfully',
data: post,
});
Tahap 8: Penulisan Kode & Konfigurasi
//export function
module.exports = {
findPosts,
createPost,
findPostById,
updatePost,
}
Tahap 9: Penulisan Kode & Konfigurasi
//import express
const express = require('express')
//init express router
const router = express.Router();
//import PostController
const PostController = require('../controllers/PostController');
//import validate post
const { validatePost } = require('../utils/validators');
//define route for posts
router.get('/posts', PostController.findPosts);
//define route for create post
router.post('/posts', validatePost, PostController.createPost);
//define route for get post by id
router.get('/posts/:id', PostController.findPostById);
//define route for update post
router.put('/posts/:id', validatePost, PostController.updatePost);
//export router
module.exports = router
Tahap 10: Penulisan Kode & Konfigurasi
//define route for update post
router.put('/posts/:id', validatePost, PostController.updatePost);
Tahap 11: Penulisan Kode & Konfigurasi
{
"success": true,
"message": "Post Updated Successfully",
"data": {
"id": "66f4b24a526d2c38ce14f2ae",
"title": "Belajar Express dan MongoDB di SantriKoding - Edit",
"content": "Belajar Express dan MongoDB di SantriKoding - Edit",
"createdAt": "2024-09-26T01:00:57.237Z",
"updatedAt": "2024-09-26T02:22:08.273Z"
}
}
Selalu gunakan pendekatan deklaratif, validasi input seawal mungkin di boundary layer, dan lakukan logging terstruktur untuk memudahkan observability ketika sistem dijalankan di lingkungan cloud produksi.
Kesimpulan
Dengan mengikuti langkah-langkah terstruktur di atas, implementasi modul Anda akan jauh lebih rapi, aman dari bug umum, serta siap diskalakan ke lingkungan produksi.
Nantikan artikel tutorial praktis lainnya seputar fullstack development, microservices, dan otomasi AI di Blog Engineering SiHubung. Selamat mencoba!