The middleware factory pattern is used to create middleware functions that accept parameters to customize their behavior.
Step 2: Compare options with the concept
Only To create middleware functions that can be customized with different settings correctly describes creating customizable middleware functions. Other options describe unrelated features.
Final Answer:
To create middleware functions that can be customized with different settings -> Option B
Hint: Middleware factory = function returning middleware with parameters [OK]
Common Mistakes:
Thinking it automatically handles errors
Confusing with routing or caching
Believing it speeds response time directly
2. Which of the following is the correct syntax for a middleware factory function in Express?
easy
A. function logger() { /* middleware code */ }
B. function logger(req, res, next) { return function(level) { /* middleware code */ } }
C. function logger(level) { return function(req, res, next) { /* middleware code */ } }
D. function logger(level, req, res, next) { /* middleware code */ }
Solution
Step 1: Identify middleware factory structure
A middleware factory is a function that takes parameters and returns a middleware function with signature (req, res, next).
Step 2: Match syntax to this pattern
function logger(level) { return function(req, res, next) { /* middleware code */ } } matches this: it takes 'level' and returns a function with (req, res, next). Others do not follow this pattern.
Final Answer:
function logger(level) { return function(req, res, next) { /* middleware code */ } } -> Option C
Quick Check:
Factory returns middleware function = function logger(level) { return function(req, res, next) { /* middleware code */ } } [OK]
Hint: Factory takes params, returns (req, res, next) function [OK]
Common Mistakes:
Placing req, res, next in factory parameters
Not returning a middleware function
Confusing middleware and factory signatures
3. Given the middleware factory below, what will be logged when a request is made?
C. Middleware factory should not return a function
D. Missing parentheses when calling next()
Solution
Step 1: Review middleware function call
Inside middleware, next must be called as a function: next().
Step 2: Identify the error
The code uses 'next;' instead of 'next();', so middleware will not proceed correctly.
Final Answer:
Missing parentheses when calling next() -> Option D
Quick Check:
Call next() with parentheses [OK]
Hint: Always call next() as a function, not just next [OK]
Common Mistakes:
Writing next without parentheses
Confusing status and send methods
Thinking factory should not return a function
5. You want to create a middleware factory that limits requests based on a max count per user. Which approach correctly applies the middleware factory pattern to achieve this?
hard
A. function rateLimiter(maxRequests) {
const counts = new Map();
return function(req, res, next) {
const user = req.user.id;
counts.set(user, (counts.get(user) || 0) + 1);
if(counts.get(user) > maxRequests) {
res.status(429).send('Too many requests');
} else {
next();
}
};
}
B. function rateLimiter(req, res, next, maxRequests) {
// logic here
}
C. function rateLimiter(maxRequests) {
return function(req, res) {
// missing next call
};
}
D. function rateLimiter() {
// no parameters, fixed limit
}
Solution
Step 1: Understand the requirement for customizable limit
The middleware must accept maxRequests as a parameter to customize the limit.
Step 2: Check which option correctly returns middleware with (req, res, next) and uses maxRequests
function rateLimiter(maxRequests) {
const counts = new Map();
return function(req, res, next) {
const user = req.user.id;
counts.set(user, (counts.get(user) || 0) + 1);
if(counts.get(user) > maxRequests) {
res.status(429).send('Too many requests');
} else {
next();
}
};
} correctly implements a factory that returns middleware tracking counts and enforcing maxRequests, calling next() properly.
Final Answer:
function rateLimiter(maxRequests) {
const counts = new Map();
return function(req, res, next) {
const user = req.user.id;
counts.set(user, (counts.get(user) || 0) + 1);
if(counts.get(user) > maxRequests) {
res.status(429).send('Too many requests');
} else {
next();
}
};
} -> Option A
Quick Check:
Factory with param returns middleware calling next() = function rateLimiter(maxRequests) {
const counts = new Map();
return function(req, res, next) {
const user = req.user.id;
counts.set(user, (counts.get(user) || 0) + 1);
if(counts.get(user) > maxRequests) {
res.status(429).send('Too many requests');
} else {
next();
}
};
} [OK]