The Conversation Between Client and Server 💬

ব্যাকএন্ড ডেভেলপমেন্ট মূলত একটি আদান-প্রদানের খেলা। ক্লায়েন্ট (ব্রাউজার) একটি Request পাঠায় এবং সার্ভার তার প্রেক্ষিতে একটি Response দেয়।

৫.১ Create Server from Scratch (The Anatomy) 🏗️

Node.js-এর http মডিউল ব্যবহার করে আমরা সার্ভার তৈরি করি। এটি সরাসরি ওএস-এর নেটওয়ার্ক পোর্টের সাথে কানেক্ট হয়।

const http = require("http");

const server = http.createServer((req, res) => {
    // এই ফাংশনটি প্রতিবার রিকোয়েস্ট আসলে কল হয়
    console.log("A request received at:", new Date().toLocaleTimeString());
    
    res.setHeader("X-Powered-By", "Node.js-Learning"); // Custom Header
    res.write("Server is alive and kicking!");
    res.end();
});

const PORT = 3000;
server.listen(PORT, () => {
    console.log(`🚀 Server is flying on http://localhost:${PORT}`);
});

৫.২ Request & Response Deep Dive 📨

সার্ভার তৈরির সময় আমরা দুটি অবজেক্ট পাই: req এবং res। এদের গভীরে অনেক তথ্য থাকে।

📥 Request (req)

  • req.url → কোন পাথে রিকোয়েস্ট এসেছে
  • req.method → কোন মেথডে এসেছে (GET, POST, PUT, DELETE)
  • req.headers → ক্লায়েন্টের ডিভাইস বা ব্রাউজার সম্পর্কিত তথ্য

📤 Response (res)

  • res.statusCode → উত্তরের অবস্থা (200, 404, 500)
  • res.setHeader() → ব্রাউজারকে বলা যে আমি কী ধরণের ডেটা পাঠাচ্ছি
  • res.end() → সবচেয়ে গুরুত্বপূর্ণ! এটি না দিলে ব্রাউজার আজীবন লোড হতে থাকবে

৫.৩ Manual Routing (The Logic Gate) 🚦

রাউটিং মানে হলো ট্রাফিক পুলিশের মতো কাজ করা। ইউজার কোন রোডে (URL) যাবে, তা সার্ভার ঠিক করে দেয়।

const http = require("http");

const server = http.createServer((req, res) => {
    const path = req.url.toLowerCase();

    // Routing Logic
    if (path === "/" || path === "/home") {
        res.writeHead(200, { "Content-Type": "text/html" });
        res.end("<h1>Welcome to Zarratin Home</h1>");
    } 
    else if (path === "/about") {
        res.writeHead(200, { "Content-Type": "text/html" });
        res.end("<h1>Our Story</h1><p>We provide premium lifestyle products.</p>");
    } 
    else {
        // Fallback for 404
        res.writeHead(404, { "Content-Type": "text/html" });
        res.end("<h1>404!</h1><p>The page you are looking for doesn't exist.</p>");
    }
});

server.listen(3000);

৫.৪ JSON API Construction (Standard Communication) 📡

আধুনিক ওয়েব ও মোবাইল অ্যাপের জন্য আমরা HTML পাঠাই না, পাঠাই JSON। এটি লাইটওয়েট এবং মেশিন-রিডেবল।

const http = require("http");

const server = http.createServer((req, res) => {
    if (req.url === "/api/products" && req.method === "GET") {
        const products = [
            { id: 1, name: "Premium Attar", price: 500 },
            { id: 2, name: "Silk Panjabi", price: 2500 }
        ];

        // ১. হেডার সেট করা যাতে ব্রাউজার বোঝে এটা JSON
        res.writeHead(200, { "Content-Type": "application/json" });
        
        // ২. অবজেক্টকে স্ট্রিং-এ রূপান্তর করে পাঠানো
        res.end(JSON.stringify({
            success: true,
            count: products.length,
            data: products
        }));
    }
});

server.listen(3000);

🌟 Status Codes: Senior Insight 📊

একজন ভালো ডেভেলপার শুধু ডেটা পাঠায় না, সঠিক স্ট্যাটাস কোডও পাঠায়।

Range Meaning Example
2xx (Success) সবকিছু ঠিক আছে 200 OK, 201 Created
3xx (Redirection) অন্য কোথাও যাও 301 Moved Permanently
4xx (Client Error) ইউজার ভুল করেছে 400 Bad Request, 404 Not Found
5xx (Server Error) সার্ভারে আগুন লেগেছে! 500 Internal Server Error

💡 Interview Q&A (Chapter 5)

প্রশ্ন ১: res.writeHead() এবং res.setHeader() এর মধ্যে পার্থক্য কী?

উত্তর: res.setHeader() দিয়ে আপনি একটি একটি করে হেডার সেট করতে পারেন। কিন্তু res.writeHead() দিয়ে আপনি একইসাথে স্ট্যাটাস কোড এবং মাল্টিপল হেডার সেট করতে পারেন। মনে রাখবেন, writeHead() কল করার পর আর কোনো হেডার সেট করা যায় না।

প্রশ্ন ২: Node.js এ Stream ব্যবহার করে কীভাবে Response পাঠানো যায়?

উত্তর: যখন আমরা অনেক বড় ফাইল (যেমন ৫ মেগাবাইটের ইমেজ) পাঠাই, তখন পুরোটা র‍্যামে না নিয়ে fs.createReadStream().pipe(res) ব্যবহার করে ক্লায়েন্টকে পাঠানো হয়। এটি মেমোরি সাশ্রয় করে।

প্রশ্ন ৩: Stateless HTTP বলতে কী বোঝায়?

উত্তর: HTTP হলো একটি স্ট্যাটলেস প্রোটোকল। এর মানে হলো সার্ভার মনে রাখে না যে আগের রিকোয়েস্টটি কে পাঠিয়েছিল। এই সমস্যা সমাধানের জন্যই আমরা কুকি (Cookie) বা জেডব্লিউটি (JWT) ব্যবহার করি।

প্রশ্ন ৪: আপনি কেন ম্যানুয়াল রাউটিং-এর বদলে এক্সপ্রেস (Express) ব্যবহার করবেন?

উত্তর: ম্যানুয়াল রাউটিং-এ যখন প্রজেক্ট বড় হয়, তখন শত শত if-else লিখতে হয় যা মেইনটেইন করা অসম্ভব। এক্সপ্রেস আমাদের মিডলওয়্যার, রাউটার এবং ক্লিন স্ট্রাকচার দেয় যা ডেভেলপমেন্ট স্পিড ১০ গুণ বাড়িয়ে দেয়।

🎯 অধ্যায় ৫ এর সারাংশ (Summary)

  • http.createServer(): Node.js-এর বিল্ট-ইন http মডিউল দিয়ে সার্ভার তৈরি
  • req (Request): url, method, headers - ক্লায়েন্ট থেকে আসা সব তথ্য
  • res (Response): statusCode, setHeader, end() - সার্ভারের উত্তর
  • Manual Routing: URL ভিত্তিক ট্রাফিক ম্যানেজমেন্ট (if-else চেইন)
  • JSON API: Content-Type: application/json + JSON.stringify()
  • Status Codes: 2xx (Success), 3xx (Redirect), 4xx (Client Error), 5xx (Server Error)

📖 পরবর্তী অধ্যায় (Chapter 6): Express.js - The Game Changer 🚀

আমরা অবশেষে Express.js-এর জগতে পা রাখবো—যেখানে আমাদের কোডিং হবে আরও ফাস্ট এবং আরও স্মার্ট!

🔒 কপিরাইট সুরক্ষিত কন্টেন্ট 🔒

কপি, স্ক্রিনশট, প্রিন্ট করা সম্পূর্ণ নিষিদ্ধ।