MongoDBIntermediate
Middleware (pre/post hooks)
Mongoose middleware: save/find/update/delete-এর আগে ও পরে custom logic চালানো — বাংলায়।
11টি অংশবাংলা ভাষায়
Middleware কী?
Mongoose middleware (hooks) হলো নির্দিষ্ট অপারেশনের আগে (pre) বা পরে (post) চলা function — যেমন password hash, updated timestamp, logging, cascade delete।
pre('save')
Password hash (pre save)js
js
import bcrypt from "bcryptjs";
const userSchema = new mongoose.Schema({
email: { type: String, required: true },
password: { type: String, required: true },
});
userSchema.pre("save", async function (next) {
// শুধু password change হলে hash করব — বারবার নয়
if (!this.isModified("password")) return next();
this.password = await bcrypt.hash(this.password, 10);
next();
});
// login-এ তুলনা করার জন্য সংক্ষিপ্ত helper method
userSchema.methods.comparePassword = function (candidate) {
return bcrypt.compare(candidate, this.password);
};post('findOneAndUpdate')
Update-এর পরের hookjs
js
postSchema.post("findOneAndUpdate", async function () {
// this = query (update)
const doc = this._update;
if (doc && doc.$set && doc.$set.published === true) {
await Stats.updateOne(
{ name: "posts" },
{ $inc: { publishedCount: 1 } },
{ upsert: true }
);
}
});Delete-এর cleanup
Cascade deletejs
js
// User মুছে গেলে তার সব post-ও মুছে ফেলি
userSchema.pre("deleteOne", { document: true }, async function () {
const userId = this._id;
await Post.deleteMany({ author: userId });
});
// findByIdAndDelete দিলেও hook চলে —
// কারণ ভেতরে deleteOne query হয়
await User.findByIdAndDelete(userId);Common hooks
| Hook | কখন চলে |
|---|---|
pre/post('save') | Document save-এর আগে/পরে |
pre/post('validate') | Validation-এর আগে/পরে |
pre/post('find') | find/findOne query-র আগে/পরে |
pre/post('findOneAndUpdate') | update query-র আগে/পরে |
pre/post('deleteOne') | delete deleteMany-এর আগে/পরে |
pre/post('aggregate') | Aggregation pipeline-এর আগে/পরে |
Arrow function ব্যবহার করবেন না
Hook-এ function keyword ব্যবহার করুন — তাতে this-এর ভেতরে document বা query পাবেন। Arrow function ব্যবহার করলে this কাজ করবে না।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।