ধরুন 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 কখনো আলাদা হয়ে যায় না।