5 min read
•Question 15 of 27mediumWhat is Mongoose middleware (hooks)?
Pre and post hooks for operations.
What You'll Learn
- Pre middleware
- Post middleware
- Common use cases
What is Middleware?
Middleware (hooks) are functions executed before or after certain operations like save, validate, remove.
Pre Middleware
code.jsJavaScript
// Hash password before saving
userSchema.pre('save', async function(next) {
if (!this.isModified('password')) return next();
this.password = await bcrypt.hash(this.password, 10);
next();
});
// Update timestamp
userSchema.pre('save', function(next) {
this.updatedAt = new Date();
next();
});
// Pre find - exclude deleted
userSchema.pre(/^find/, function(next) {
this.where({ deleted: { $ne: true } });
next();
});Post Middleware
code.jsJavaScript
// After save
userSchema.post('save', function(doc) {
console.log('User saved:', doc._id);
});
// After remove
userSchema.post('remove', async function(doc) {
await Comment.deleteMany({ userId: doc._id });
});
// Error handling
userSchema.post('save', function(error, doc, next) {
if (error.code === 11000) {
next(new Error('Email already exists'));
} else {
next(error);
}
});Query Middleware
code.jsJavaScript
// Pre findOneAndUpdate
userSchema.pre('findOneAndUpdate', function(next) {
this.set({ updatedAt: new Date() });
next();
});Aggregate Middleware
code.jsJavaScript
userSchema.pre('aggregate', function(next) {
this.pipeline().unshift({ $match: { active: true } });
next();
});