Chapters of Frontend Dev থেকে Full-Stack Backend

Week 1 - API FoundationChapter 4 of 282 min read

Englishবাংলা

Validation layer - Zod দিয়ে ভুল data দরজাতেই থামান

Zod schema, validation middleware, custom error message, validation কোথায় রাখবেন

ধরুন user signup করল, কিন্তু email-এর জায়গায় লিখল 'abc'। আপনার কোড সেটা database-এ সেভ করে দিল। দুই সপ্তাহ পরে যখন তাকে email পাঠাতে যাবেন, তখন ধরা পড়ল data-টাই ভুল। ভুল data যত ভেতরে যায়, ক্ষতি তত বড় হয়। Validation-এর কাজ হলো ভুলটাকে একদম দরজায় - request ঢোকার মুখেই - থামিয়ে দেওয়া।

প্রতিটা controller-এ হাতে হাতে if (!email) ... লিখতে গেলে কোড বড় হয়, একেক জায়গায় একেক রকম হয়, আর কোনো field বাদ পড়ে যায়। সমাধান: Zod দিয়ে একবার schema লিখুন, তারপর একটা ছোট middleware সেটা চালিয়ে দিক।

import { z } from "zod";

const createUserSchema = z.object({
  name: z.string().min(2, "Name অন্তত ২ অক্ষরের হতে হবে"),
  email: z.string().email("সঠিক email দিন"),
  password: z.string().min(6, "Password অন্তত ৬ অক্ষরের হতে হবে"),
  age: z.number().int().positive().optional(),
});
function validate(schema) {
  return (req, res, next) => {
    const result = schema.safeParse(req.body);
    if (!result.success) {
      return res.status(400).json({
        success: false,
        message: "Validation failed",
        errors: result.error.flatten().fieldErrors,
      });
    }
    req.body = result.data; // পরিষ্কার করা data সামনে যাবে
    next();
  };
}

router.post("/users", validate(createUserSchema), createUser);

দুটো জিনিস লক্ষ্য করুন। এক, error message field ধরে ধরে আসছে - frontend ঠিক কোন input-এর নিচে লাল লেখা দেখাবে, সেটা বলে দেওয়া যায়। দুই, req.body-তে এখন schema পার হওয়া data আছে - বাড়তি field যা পাঠানো হয়েছিল, সেগুলো Zod ফেলে দিয়েছে। এটা একটা security সুবিধাও, কারণ user চাইলেও role: "admin" ধরনের বাড়তি field ঢুকিয়ে দিতে পারবে না, যদি schema-তে সেটা না থাকে।

Validation শুধু body-তে না, req.query আর req.params-এও দরকার হতে পারে - যেমন pagination-এর page যেন number-ই হয়। একই middleware-কে সামান্য বদলে তিন জায়গাতেই ব্যবহার করা যায়।

সবাই যে ভুলটা করে

Validation শুধু frontend-এ রাখা। Frontend-এর validation হলো user experience-এর জন্য, নিরাপত্তার জন্য নয় - যে কেউ Postman দিয়ে সরাসরি API-তে ভুল বা ক্ষতিকর data পাঠাতে পারে। নিয়ম একটাই: server-side validation ছাড়া কোনো data database-এ যাবে না।

আজকের Practice

আপনার POST /users endpoint-এ Zod validation যোগ করুন। তারপর ইচ্ছা করে তিন রকম ভুল data পাঠান - ভুল email, ছোট password, বাড়তি অচেনা field - আর দেখুন প্রতিবার ঠিকঠাক 400 response আসছে কিনা।

Interview-এ কীভাবে বলবেন

আমি validation একটা আলাদা layer-এ রাখি - Zod schema দিয়ে, middleware আকারে। এতে controller পরিষ্কার থাকে, error format সব জায়গায় এক হয়, আর schema থেকে TypeScript type-ও পেয়ে যাই, ফলে type আর validation কখনো আলাদা হয়ে যায় না।

All chapters of Frontend Dev থেকে Full-Stack Backend