Bird
Raised Fist0
Expressframework~5 mins

app.all and app.use for catch-all in Express

Choose your learning style10 modes available
Introduction

We use app.all and app.use to handle all types of requests or routes that don't match any specific path. This helps catch everything else and respond properly.

When you want to handle every HTTP method (GET, POST, etc.) for a specific route.
When you want to create a fallback route for any unmatched URL.
When you want to add middleware that runs for all routes.
When you want to show a 404 page for unknown routes.
When you want to log or process every request regardless of method or path.
Syntax
Express
app.all(path, callback)
app.use([path], callback)

app.all listens to all HTTP methods for the given path.

app.use adds middleware that runs for all HTTP methods and paths starting with the given path. If no path is given, it runs for all routes.

Examples
This handles GET, POST, PUT, DELETE, etc. on '/example'.
Express
app.all('/example', (req, res) => {
  res.send('All methods on /example');
});
This middleware runs for every request, no matter the path or method.
Express
app.use((req, res, next) => {
  console.log('Request received');
  next();
});
This middleware runs for any route starting with '/admin'.
Express
app.use('/admin', (req, res, next) => {
  console.log('Admin area accessed');
  next();
});
This catches all routes not matched earlier and sends a 404 response.
Express
app.all('*', (req, res) => {
  res.status(404).send('Page not found');
});
Sample Program

This Express app shows how app.use logs every request, app.all handles all methods on '/all', and a catch-all app.all('*') sends a 404 for unknown routes.

Express
import express from 'express';

const app = express();
const port = 3000;

// Middleware for all requests
app.use((req, res, next) => {
  console.log(`Received ${req.method} request for ${req.url}`);
  next();
});

// Handle GET on /hello
app.get('/hello', (req, res) => {
  res.send('Hello World');
});

// Catch all HTTP methods on /all
app.all('/all', (req, res) => {
  res.send(`You made a ${req.method} request to /all`);
});

// Catch all unmatched routes
app.all('*', (req, res) => {
  res.status(404).send('Sorry, page not found');
});

app.listen(port, () => {
  console.log(`Server running on http://localhost:${port}`);
});
OutputSuccess
Important Notes

Order matters: Place app.use and app.all catch-alls after specific routes so they don't block them.

app.use can take a path prefix and runs for all methods and sub-paths.

Use app.all('*') to catch any route not matched earlier, often for 404 pages.

Summary

app.all handles all HTTP methods for a specific path.

app.use adds middleware for all methods and paths starting with a prefix.

Use catch-all routes to handle unknown URLs or add global middleware.

Practice

(1/5)
1. What does app.all('/path', handler) do in an Express app?
easy
A. It handles all HTTP methods for the specific '/path' route.
B. It adds middleware for all routes starting with '/path'.
C. It only handles GET requests for '/path'.
D. It handles all routes and methods globally.

Solution

  1. Step 1: Understand app.all usage

    app.all is designed to handle every HTTP method (GET, POST, PUT, DELETE, etc.) but only for the exact route specified.
  2. Step 2: Compare with other methods

    app.use adds middleware for all methods but for routes starting with a prefix, not just one exact path.
  3. Final Answer:

    It handles all HTTP methods for the specific '/path' route. -> Option A
  4. Quick Check:

    app.all = all methods, exact path [OK]
Hint: Remember: app.all = all methods, one exact path [OK]
Common Mistakes:
  • Confusing app.all with app.use
  • Thinking app.all handles all routes globally
  • Assuming app.all only handles GET requests
2. Which of the following is the correct syntax to add a catch-all middleware for all routes in Express without specifying a path?
easy
A. app.all('*', (req, res) => { res.send('Catch all'); });
B. app.use((req, res) => { res.send('Catch all'); });
C. app.use('*', (req, res) => { res.send('Catch all'); });
D. app.all((req, res) => { res.send('Catch all'); });

Solution

  1. Step 1: Understand catch-all middleware syntax

    Using app.use without a path applies middleware to all routes and methods.
  2. Step 2: Analyze options

    app.all('*', (req, res) => { res.send('Catch all'); }); and app.use('*', (req, res) => { res.send('Catch all'); }); both specify a path '*'. app.all((req, res) => { res.send('Catch all'); }); is invalid syntax.
  3. Final Answer:

    app.use((req, res) => { res.send('Catch all'); }); -> Option B
  4. Quick Check:

    app.use without path = catch-all middleware [OK]
Hint: app.use without path catches all routes and methods [OK]
Common Mistakes:
  • Using app.use('*', ...) which specifies a path
  • Using app.all without a path argument
  • Confusing app.all and app.use syntax
3. What will be the output when a GET request is made to '/test' in this Express app?
const express = require('express');
const app = express();

app.all('/test', (req, res, next) => {
  res.write('all ');
  next();
});

app.use('/test', (req, res) => {
  res.end('use');
});

app.listen(3000);
medium
A. Error: Cannot set headers after they are sent
B. use
C. all use
D. all

Solution

  1. Step 1: Trace app.all handler

    For GET '/test', app.all('/test') runs first, writes 'all ' to response, then calls next() to continue.
  2. Step 2: Trace app.use handler

    Next, app.use('/test') matches and ends the response with 'use'. So the full response is 'all use'.
  3. Final Answer:

    all use -> Option C
  4. Quick Check:

    app.all writes + next() then app.use ends response [OK]
Hint: app.all runs first, next() continues to app.use [OK]
Common Mistakes:
  • Assuming app.use runs before app.all
  • Thinking res.end in app.use causes error here
  • Ignoring next() call in app.all
4. Identify the error in this Express code snippet:
app.all('/api', (req, res) => {
  res.send('API all methods');
  next();
});
medium
A. Calling next() after res.send() causes an error.
B. app.all cannot be used with '/api' path.
C. res.send() must be called twice in app.all.
D. No error, code works fine.

Solution

  1. Step 1: Understand res.send() behavior

    res.send() ends the response and sends data to client.
  2. Step 2: Analyze next() call after res.send()

    Calling next() after res.send() tries to continue middleware chain after response ended, causing an error.
  3. Final Answer:

    Calling next() after res.send() causes an error. -> Option A
  4. Quick Check:

    res.send ends response; next() after it is wrong [OK]
Hint: Never call next() after res.send() or res.end() [OK]
Common Mistakes:
  • Thinking next() is always safe after res.send()
  • Believing app.all can't use paths
  • Ignoring response end behavior
5. You want to create a global catch-all middleware without specifying a path that logs every request method and URL, then passes control to the next handler. Which code correctly implements this in Express?
hard
A. app.all('*', (req, res, next) => { console.log(req.method, req.url); next(); });
B. app.all((req, res, next) => { console.log(req.method, req.url); next(); });
C. app.use('*', (req, res, next) => { console.log(req.method, req.url); next(); });
D. app.use((req, res, next) => { console.log(req.method, req.url); next(); });

Solution

  1. Step 1: Understand global middleware with app.use

    Using app.use without a path applies middleware to all routes and methods globally.
  2. Step 2: Analyze options for logging middleware

    app.all('*', (req, res, next) => { console.log(req.method, req.url); next(); }); and app.use('*', (req, res, next) => { console.log(req.method, req.url); next(); }); specify a path '*'. app.all((req, res, next) => { console.log(req.method, req.url); next(); }); is invalid syntax.
  3. Final Answer:

    app.use((req, res, next) => { console.log(req.method, req.url); next(); }); -> Option D
  4. Quick Check:

    app.use without path = global middleware [OK]
Hint: Use app.use without path for global middleware [OK]
Common Mistakes:
  • Using app.use('*', ...) which specifies a path
  • Using app.all without path argument
  • Forgetting to call next() in middleware
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard