এক্সপ্রেস জেএস ব্যবহার করে সিম্পল CRUD API তৈরি

এপিআই ডেভেলপ করার জন্য Node JS এর জনপ্রিয় প্যাকেজ হচ্ছে ExpressJS। এই লেখায় একটা সিম্পল নোট অ্যাপ তৈরি করব। যেখানে নোট তৈরি, নোট দেখা, নোট আপডেট করা এবং ডিলেট করা সম্পর্কে জানব।

আমি অনেক ব্যাসিক কিছুও দেখানোর চেষ্টা করব। যেন সবার জন্য সুবিধা হয়। আমরা IDE হিসেবে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করব। যে ডিরেক্টরি/ফোল্ডারে প্রজেক্ট তৈরি করব, তা ড্র্যাগ এন্ড ড্রপ করে ভিজ্যুয়াল স্টুডিওতে ছেড়ে দিব। বা File > Open Folder এরপর ঐ ফোল্ডার সিলেক্ট করব। আমি ডেস্কটপে note_app নামে একটা ফোল্ডার তৈরি করেছি। এরপর ভিজ্যুয়াল স্টুডিওতে তা ওপেন করেছি।

উপরের দিকে টার্মিনাল দেখানোর আইকন দেখা যাবে। অথবা মেন্যু বার থেকেও Terminal > New Terminal এ ক্লিক করে টার্মিনাল ওপেন করে নেওয়া যাবে।

এক্সপ্রেস JS এর জন্য কম্পিউটারে Node.js ইন্সটল থাকা লাগবে। ওয়েব সাইটে গিয়ে ইন্সটলার ব্যবহার করে ইন্সটল করে নেওয়া যাবে।

node -v
npm -v

npm হচ্ছে Node JS এর প্যাকেজ লাইব্রেরী। নোড ইন্সটল করলে সাধারণত প্যাকেজ ম্যানেজারও ইন্সটল হয়ে থাকে। এর আগে একটা সিম্পল API কিভাবে তৈরি করা যায়, তা সম্পর্কে লিখেছি। ঐটা পড়া যাবে এখান থেকেঃ এক্সপ্রেস JS ব্যবহার করে সিম্পল API তৈরি

প্রজেক্ট ইনিশিয়ালাইজ

প্রজেক্টের টার্মিনালে গিয়ে লিখবঃ

npm init -y

তাহলে আমাদের জন্য package.json ফাইল তৈরি করে দিবে।

আমরা এই প্রজেক্টে Express ব্যবহার করব API তৈরি করার জন্য। ডেটাবেজ হিসেবে SQLite ব্যবহার করব। তার জন্য এই দুইটা প্যাকেজ যোগ করে নিবঃ

npm install express sqlite3 sqlite

এছাড়া হট রিলোডের জন্য nodemon প্যাকেজ ব্যবহার করব। এটা অপশনাল, তবে খুবি কাজের জিনিস।

npm install --save-dev nodemon
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },

package.json ফাইলের উপরের স্ক্রিপ্টা রিপ্লেস করে এভাবে লিখবঃ

"scripts": {
  "dev": "nodemon index.js"
}

এবং “type”: “module”, যোগ করব। এর ফলে আমরা মডার্ন ES স্টাইলে কোড লিখতে পারব। আমাদের প্যাকেজ ফাইল হবে এমনঃ

{
  "name": "note_app",
  "version": "1.0.0",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "dev": "nodemon index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "express": "^5.1.0",
    "sqlite": "^5.1.1",
    "sqlite3": "^5.1.7"
  }
}

এবার index.js ফাইল লিখব এভাবেঃ

import express from "express";
import notesRouter from "./routes/notes.js";
import db from "./db.js";

const app = express();
const PORT = 3000;

app.use(express.json());

// Routes
app.use("/notes", notesRouter);

app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

db.js ফাইল লিখব এভাবেঃ

import sqlite3 from "sqlite3";
import { open } from "sqlite";

// open the database
const dbPromise = open({
  filename: "./notes.db",
  driver: sqlite3.Database
});

// Create the table if not exists
(async () => {
  const db = await dbPromise;
  await db.run(`
    CREATE TABLE IF NOT EXISTS notes (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      title TEXT NOT NULL,
      content TEXT NOT NULL,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )
  `);
})();

export default dbPromise;

এই ফাইল আমাদের প্রথমবার notes.db নামে একটা SQLite ফাইল তৈরি করে দিবে। এরপর টেবিল তৈরি করবে। পরের বার থেকে ঐ ডেটাবেজ রিটার্ণ করবে, যেন ডেটাবেজ থেকে ডেটা পড়তে এবং লিখতে পারি।

আমরা সিম্পল একটা CRUD API তৈরি করব বলছি। তার জন্য routes/notes.js ফাইল এভাবে লিখতে পারিঃ

import express from "express";
import dbPromise from "../db.js";

const router = express.Router();

// ✅ Create Note
router.post("/", async (req, res) => {
  const { title, content } = req.body;
  if (!title || !content)
    return res.status(400).json({ error: "Title and content are required" });

  const db = await dbPromise;
  const result = await db.run(
    "INSERT INTO notes (title, content) VALUES (?, ?)",
    [title, content]
  );

  res.json({ id: result.lastID, title, content });
});

// 📖 Get All Notes
router.get("/", async (req, res) => {
  const db = await dbPromise;
  const notes = await db.all("SELECT * FROM notes ORDER BY created_at DESC");
  res.json(notes);
});

// 🔍 Get Single Note
router.get("/:id", async (req, res) => {
  const db = await dbPromise;
  const note = await db.get("SELECT * FROM notes WHERE id = ?", [req.params.id]);

  if (!note) return res.status(404).json({ error: "Note not found" });
  res.json(note);
});

// ✏️ Update Note
router.put("/:id", async (req, res) => {
  const { title, content } = req.body;
  const db = await dbPromise;
  const result = await db.run(
    "UPDATE notes SET title = ?, content = ? WHERE id = ?",
    [title, content, req.params.id]
  );

  if (result.changes === 0)
    return res.status(404).json({ error: "Note not found" });
  res.json({ message: "Note updated" });
});

// ❌ Delete Note
router.delete("/:id", async (req, res) => {
  const db = await dbPromise;
  const result = await db.run("DELETE FROM notes WHERE id = ?", [req.params.id]);

  if (result.changes === 0)
    return res.status(404).json({ error: "Note not found" });
  res.json({ message: "Note deleted" });
});

export default router;

টার্মিনালে এরপর টার্মিনালে গিয়ে লিখবঃ

npm run dev

index.js এ আমরা পোর্ট এবং রাউট লিখে দিয়েছিলাম। সে অনুযায়ী আমাদের নোট গুলো পাওয়া যাবে http://localhost:3000/notes ঠিকানার GET রিকোয়েস্টে। যদি কোন নোট না থাকে, তাহলে একটা শূন্য অ্যারে রিটার্ণ করবে। ব্রাউজারেও দেখা যাবে এই রাউট।

API টেস্ট করার জন্য অনেক গুলো সুন্দর সলিউশন রয়েছে। আমি সাধারণত পোস্টম্যান ব্যবহার করি। এখানে একটা টিউটোরালও লিখেছিলামঃ রেস্ট এপিআই টেস্ট করার জন্য পোস্টম্যান

নতুন নোট তৈরি করার জন্য পোস্ট রিকোয়েস্ট করতে হবে। একটা নতুন রিকোয়েস্ট তৈরি করব। এরপর রিকোয়েস্ট টাইপ হিসেবে সিলেক্ট করব POST। Body ট্যাব থেকে raw সিলেক্ট করব। এরপর নোটের টাইটেল এবং কন্টেন্ট পাস করে Send এ ক্লিক করবঃ

{
  "title": "My first note",
  "content": "Hello world!"
}

দেখব ডেটাবেজে ডেটা যোগ হয়েছে। আমরা যদি এখন ব্রাউজারে http://localhost:3000/notes ভিজিট করি, তাহলে নোটের JSON রেসপন্স দেখতে পাবো। একাধিক নোট তৈরি করলে একাধিক নোট JSON অ্যারে আকারে রিটার্ণ করবে। ভিজ্যুয়াল স্টুডিও কোডে SQLite ভিউয়ার ব্যবহার করে ডেটাবেজ ব্রাউজ করে ডেটা দেখা যাবে। এছাড়া DBeaver ও ব্যবহার করে SQLite ডেটাবেজ দেখা যাবে। এই সফটওয়ারের প্রচুর ফিচার। অনেক কাজের একটা সফটওয়ার। এমনকি Entity Relationship Diagram (ERD) ভিজ্যুয়ালি দেখা যাবে। যা আমাদের ভবিষ্যতে দরকার হতে পারে।

একটা সিঙ্গেল নোট দেখা

আমাদের API তে একটা সিঙ্গেল নোট দেখার এন্ডপয়েন্ট যোগ করা আছে। যেমন http://localhost:3000/notes/1 রাউটে GET রিকোয়েস্ট করলে প্রথম নোট রিটার্ণ করবে।

নোট আপডেট করা

নোট আপডেট করার জন্য PUT রিকোয়েস্ট করতে হয়। এখানে URL এ কোন নোট আপডেট করব, তার আইডি ব্যবহার করতে হবে। যেমন আমরা প্রথম নোট আপডেট করব।

বামপাশের ডান কোনা থেকে আমরা রিকোয়েস্ট টাইপ পরিবর্তন করে PUT সিলেক্ট করেছি। এরপর আপডেটেড টাইটেল এবং কন্টেন্ট ব্যবহার করে রিকোয়েস্ট করলে নোট আপডেট হবে।

নোট ডিলিট করা

নির্দিষ্ট আইডি ব্যবহার করে DELETE রিকোয়েস্ট করলে ঐ নোট ডিলিট হয়ে যাবে।

এই লেখায় ব্যাসিক অনেক কিছুই শিখেছি। এটার উপর ভিত্তি করেই অনেক বড় সব প্রজেক্ট তৈরি করে ফেলা যাবে। এরপরের বার আমরা অথেনটিকেশন যোগ করব। যেন নির্দিষ্ট ইউজারের নোট সে ছাড়া অন্য কেউ দেখতে না পারে।

Leave a Comment