What's the difference between application- and router level- middleware when routing in Express? What's the difference between application- and router level- middleware when routing in Express? express express

What's the difference between application- and router level- middleware when routing in Express?


What is the purpose of app.use passing it to router.get instead of simply using app.get?

This is all just designing for modularity. It allows an application to be divided into several smaller loosely-coupled pieces and because they all do not have any direct knowledge of the shared app instance that combines them together, the modularity is achieved.

For example, you could build a whole user account subsystem that handles sign up, login, forgot password, etc, and share it between several different applications by "mounting" it within them via app.use(require("my-user-system")).

That's the only purpose behind this. There no functional, technical, or performance difference otherwise.

And generally, what's the difference between app.VERB and router.VERB in terms of routing?

No difference. The app has it's own main/primary router and app.VERB is just convenience sugar for the equivalent of app.router.VERB.


An example will help here:

In the birds.js:

// birds.jsvar express = require('express');var router = express.Router();// middleware that is specific to this routerrouter.use(function timeLog(req, res, next) {    console.log('Time: ', Date.now());    next();});// define the home page routerouter.get('/', function (req, res) {    res.send('Birds home page');});

In the app.js:

// app.jsconst express = require('express')const app = express()var birds = require('./birds');app.use('/birds', birds);app.listen(3000, () => console.log('app listening on port 3000!\naccess http://localhost:3000/birds/'))

Now requests to http://localhost:3000/birds/ will go to birds.js file.

This modular approach will make easy to maintain a large code base, as the application grows big.

Source: https://expressjs.com/en/guide/routing.html


Application has the method listen and some other which router doesn't have.

Application "does" the main thing, while route only groups some routes, provides encapsulation (see Manohar's answer with example).

Routes in router doesn't necessarily know in advance what will be its full route. See in the example that '/birds' is defined in app.js which is root for router in birds.js ... difference between app.VERB and rourer.VERB is in the context.