DEV Community

Salim Al Sazu
Salim Al Sazu

Posted on

Handle Same key Validation

ধরি কোন প্রাপার্টি যদি আগে থেকেই থাকে তাহলে সেটা পুনরায় আবার এন্ট্রি দেওয়া যাবে না, এর জন্য একটা Validation করতে হবে। কোন ইউজার যদি এড করতে চায় তাহলে সে একটা এরর থ্রূ দেখতে পাবে।

ধরি ডাটাবেসে একটা অব্জেক্ট আছে এরকমঃ

{
”name”: “Salim Al Sazu”,

"position": “Web Developer”
}

সেইম নামে আরেকটা যদি পোস্ট করতে চাই তাহলে সে এরর দিবে। এখন কোডে আসা যাকঃ

এখন এই ভ্যালিডেশনটা আমরা কোথায় করবো, রাউটারে, কন্ট্রলারে নাকি সার্ভিসে ? না মডেলে …… ?

মঙ্গুজে দুই ধরনের হুক আছে একটা প্রি আরেকটা পোস্ট, প্রি মানে ডাটা সেভ করার আগে চেক করে আর পোস্ট ডাঁটা সেভ করার পর।

এখন প্রি হুক দিয়ে চেক করে নিবো যদি কোন ডাটা না থেকে তাহলে পোস্ট করবে, না হলে এরর থ্র করবে ।

নরমালি যেভাবে স্কিমা নেওয়া হিয় সেভাবে একটা স্কিমা নিবোঃ

const UserSchema= new Schema(
  {
    name: {
      type: String,
      required: true,
    },
    position: {
      type: String,
      required: true,
    }
  },
  {
    timestamps: true,
  }
);
Enter fullscreen mode Exit fullscreen mode

স্কিমা নেওয়া হিয়ে গেলে সেটার উপর মঙ্গুজ এর pre-hook চালাবোঃ

যেহেতু স্কিমা নেইম UserSchema তাহলে এটা দিয়ে pre ফাংশন বলে দিবো UserSchema.pre() তারপর pre এর ভিতর 'save', async function { }নিবো । এই ফাংশনের ভিতর isExist ভ্যারিয়েবল নিয়ে একটা findOne চালাবো মডেলের নাম এর উপর (মডেলের কোড নিচে দেওয়া আছে )।

findOne বলে দিবো যদি এই ডাটা গুলো খুজে বের করো এইভাবে findOne({
name: this.name,
position: this.position,
});

খুজে বের করা পর একটা কন্ডিশিন দিবো যদি এই গুলো

তারপর একটা কন্ডিশন দিবো যদি এই গুলো isExist করে তাহলে এরর দাও কনফ্লিক্ট এর ।

if (isExist) {
throw new Error(409, 'User is Already Exist');
}

আর যদি কনফ্লিক্ট না করে তাহলে next() ফাংশন চলে যাও , যা মঙ্গুজের আরেকটা হুক , এক্সপ্রেস এর নয় ।

UserSchema.pre('save', async function (next) {
  const isExist = await Users.findOne({
    name: this.name,
    position: this.position,
  });

  if (isExist) {
    throw new Error(409, 'User is Already Exist');
  }
  next();
});
Enter fullscreen mode Exit fullscreen mode

এখন যদি লিখা হয়ে যায় তাহলে মডেল যেভাবে লিখে সেভাবে লিখে ফেলবোঃ

export const Users= model(
  'user',
  UserSchema
);
Enter fullscreen mode Exit fullscreen mode

মডেল ক্রিয়েট হওয়ার আগে আমাদের সেইম ডাটা আছে কি না তা চেক করা লাগবে তাই প্রি হুক মডেলের উপরে ইউজ করা হয়েছে। যদি মডেলের পরে ব্যবহার করা হয় তাহলে সে চ্যাক না করে সেইম ডাটা পাঠিয়ে দিবে।

এখানে সার্ভিস, কন্ট্রলার , রাউট এই গুলো জানা আছে বিদায় আমরা সেইম ডাটা এরর হ্যনাডেলিং নিয়ে আলোচনা করেছি তা এই গুলো নিয়ে এখানে কথা বলা হয় নাই।

Top comments (0)