Bird
Raised Fist0
Expressframework~5 mins

Mongoose middleware (pre/post hooks) in Express - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is Mongoose middleware (pre/post hooks)?
Mongoose middleware are functions that run before (pre) or after (post) certain Mongoose actions like saving or removing data. They let you add extra steps automatically.
Click to reveal answer
beginner
When would you use a pre('save') hook in Mongoose?
Use a pre('save') hook to run code before saving a document, like hashing a password or validating data.
Click to reveal answer
intermediate
What is the difference between pre and post hooks in Mongoose?
Pre hooks run before an action (like saving), so you can modify data or stop the action. Post hooks run after the action, useful for logging or cleanup.
Click to reveal answer
intermediate
How do you define a post hook for the 'remove' action in Mongoose?
You add a post hook by calling schema.post('remove', function(doc) { /* code here */ }); This runs after a document is removed.
Click to reveal answer
intermediate
Can Mongoose middleware hooks be asynchronous? How?
Yes, Mongoose middleware can be async by using async functions or calling next() after async work finishes. This helps wait for tasks like database calls.
Click to reveal answer
Which Mongoose middleware hook runs before saving a document?
Apre('save')
Bpost('save')
Cpre('remove')
Dpost('remove')
What is a common use case for a post('save') hook?
AHashing a password before saving
BValidating data before save
CPreventing save if invalid
DLogging that a document was saved
How do you make a Mongoose middleware function asynchronous?
AOnly use synchronous code
BUse async keyword or call next() after async work
CReturn a promise without async keyword
DUse setTimeout inside the hook
Which hook would you use to run code after a document is deleted?
Apost('remove')
Bpre('delete')
Cpre('save')
Dpost('save')
Can pre hooks prevent an action from completing?
AYes, but only post hooks can do that
BNo, pre hooks only run after the action
CYes, by throwing an error or not calling next()
DNo, hooks cannot affect actions
Explain how Mongoose pre and post middleware hooks work and give an example use case for each.
Think about what you want to do before or after saving or deleting data.
You got /4 concepts.
    Describe how to write an asynchronous pre-save hook in Mongoose and why you might need it.
    Consider tasks that take time, like talking to other services or encrypting data.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main purpose of pre middleware in Mongoose?
      easy
      A. To connect to the MongoDB database
      B. To run code after a database operation completes
      C. To define the schema structure
      D. To run code before a database operation like save or remove

      Solution

      1. Step 1: Understand middleware timing

        Pre middleware runs before a database action, allowing preparation or validation.
      2. Step 2: Differentiate pre and post hooks

        Post middleware runs after the action, so pre is for before actions.
      3. Final Answer:

        To run code before a database operation like save or remove -> Option D
      4. Quick Check:

        Pre middleware = before action [OK]
      Hint: Pre means before the action starts [OK]
      Common Mistakes:
      • Confusing pre with post middleware
      • Thinking pre defines schema structure
      • Assuming pre connects to database
      2. Which of the following is the correct syntax to add a pre-save hook in Mongoose?
      easy
      A. schema.on('save', function(next) { /* code */ next(); });
      B. schema.pre('save', function(next) { /* code */ next(); });
      C. schema.before('save', function() { /* code */ });
      D. schema.post('save', function(next) { /* code */ next(); });

      Solution

      1. Step 1: Recall Mongoose middleware method names

        Mongoose uses pre and post methods for middleware, not before or on.
      2. Step 2: Check syntax for pre-save hook

        The correct syntax is schema.pre('save', function(next) { ... next(); }); to run code before saving.
      3. Final Answer:

        schema.pre('save', function(next) { /* code */ next(); }); -> Option B
      4. Quick Check:

        Use schema.pre for pre hooks [OK]
      Hint: Use schema.pre('event', fn) for pre hooks [OK]
      Common Mistakes:
      • Using schema.post instead of schema.pre for pre hooks
      • Using non-existent methods like before or on
      • Forgetting to call next() in middleware
      3. Given this Mongoose pre-save middleware, what will be the value of doc.updatedAt after saving?
      schema.pre('save', function(next) {
        this.updatedAt = new Date();
        next();
      });
      medium
      A. Undefined because updatedAt is not set in schema
      B. The date when the document was created
      C. The current date and time when save is called
      D. An error because next() is missing

      Solution

      1. Step 1: Understand pre-save middleware effect

        The middleware sets this.updatedAt to the current date before saving.
      2. Step 2: Confirm middleware runs before save

        Since it runs before save, the document's updatedAt will be updated to the current time.
      3. Final Answer:

        The current date and time when save is called -> Option C
      4. Quick Check:

        Pre-save sets updatedAt = now [OK]
      Hint: Pre-save runs before saving, so updatedAt is current time [OK]
      Common Mistakes:
      • Assuming updatedAt is undefined without schema field
      • Confusing createdAt with updatedAt
      • Thinking next() is missing causing error
      4. What is wrong with this Mongoose middleware code?
      schema.pre('remove', (next) => {
        console.log('Removing', this._id);
        next();
      });
      medium
      A. Arrow function does not bind 'this', so 'this' is undefined inside middleware
      B. Missing call to next() to continue middleware chain
      C. Using 'remove' event is not supported in Mongoose
      D. Middleware must be post, not pre, for remove

      Solution

      1. Step 1: Check function type in middleware

        Mongoose middleware requires normal functions to bind this to the document.
      2. Step 2: Identify arrow function issue

        Arrow functions do not bind this, so this will be undefined inside the middleware.
      3. Final Answer:

        Arrow function does not bind 'this', so 'this' is undefined inside middleware -> Option A
      4. Quick Check:

        Use normal functions for middleware to access this [OK]
      Hint: Use function() not arrow to access this in middleware [OK]
      Common Mistakes:
      • Using arrow functions in middleware
      • Forgetting to call next() in async middleware
      • Thinking remove event is unsupported
      5. You want to log a message after a document is saved and also update a cache. Which Mongoose middleware setup is correct?
      hard
      A. Use schema.post('save', function(doc) { console.log('Saved:', this._id); updateCache(this); });
      B. Use schema.pre('save', function(doc) { console.log('Saved:', this._id); updateCache(this); });
      C. Use schema.post('save', (doc) => { console.log('Saved:', this._id); updateCache(this); });
      D. Use schema.pre('save', (doc) => { console.log('Saved:', this._id); updateCache(this); });

      Solution

      1. Step 1: Identify when to run logging and cache update

        Logging and cache update should happen after saving, so use post middleware.
      2. Step 2: Choose correct function syntax

        Post middleware receives the saved document as first argument; use normal function to access this if needed.
      3. Final Answer:

        Use schema.post('save', function(doc) { console.log('Saved:', this._id); updateCache(this); }); -> Option A
      4. Quick Check:

        Post-save + normal function for logging/cache [OK]
      Hint: Use post-save with normal function for after-save tasks [OK]
      Common Mistakes:
      • Using pre instead of post for after-save tasks
      • Using arrow functions losing this context
      • Not passing doc argument in post middleware