Routing
Node JS
Express Routing
var express = require('express');
var app = express();
[Link]('/about', (req, res) => {
[Link]('This is the about page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 2
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 3
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 4
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 5
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 6
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 7
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 8
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 9
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res)
=> {
[Link](3000, () => {
[Link](404).send('Not
[Link]('Listening
found!'); on port 3000');
});
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 10
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res)
=> {
[Link](3000, () => {
[Link](404).send('Not
[Link]('Listening
found!'); on port 3000');
});
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 11
Express Routing
var express = require('express');
varapp = express();
[Link]('/about', (req, res) => {
[Link]('This is the about
page.');
});
[Link]('/login', (req, res) => {
[Link]('This is the login
page.');
});
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 12
Express Middleware
• A middleware is a function that is invoked in the
handling of an HTTP request
• It is used in the “middle” between receiving
a request and sending a response
• Multiple middlewares can be chained together
on the same request
Property of Penn Engineering, Chris Murphy SD4x-4.3 13
Middleware: Serving Static Files
• The simplest middleware is [Link],
which serves static files that are locally stored
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 14
Middleware: Serving Static Files
• The simplest middleware is [Link],
which serves static files that are locally stored
var express = require('express');
var app = express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 15
Middleware: Serving Static Files
• The simplest middleware is [Link],
which serves static files that are locally stored
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 16
Middleware: Serving Static Files
• The simplest middleware is [Link],
which serves static files that are locally stored
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 17
Middleware: Serving Static Files
• The simplest middleware is [Link],
which serves static files that are locally stored
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 18
Middleware: Serving Static Files
• The simplest middleware is [Link],
which serves static files that are locally stored
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3 19
20
<!-- This is files/[Link] -->
<html>
<body>
<h1>Hello!</h1>
<img src="images/[Link]">
<!-- File is files/images/[Link] -->
</body>
</html>
Property of Penn Engineering, Chris Murphy SD4x-4.3
21
<!-- This is files/[Link] -->
<html>
<body>
<h1>Hello!</h1>
<img src="images/[Link]">
<!-- File is files/images/[Link] -->
</body>
</html>
Property of Penn Engineering, Chris Murphy SD4x-4.3
22
<!-- This is files/[Link] -->
<html>
<body>
<h1>Hello!</h1>
<img src="images/[Link]">
<!-- File is files/images/[Link] -->
</body>
</html>
Property of Penn Engineering, Chris Murphy SD4x-4.3
23
<!-- This is files/[Link] -->
<html>
<body>
<h1>Hello!</h1>
<img src="images/[Link]">
<!-- File is files/images/[Link] -->
</body>
</html>
Property of Penn Engineering, Chris Murphy SD4x-4.3
24
<!-- This is files/[Link] -->
<html>
<body>
<h1>Hello!</h1>
<img src="images/[Link]">
<!-- File is files/images/[Link] -->
</body>
</html>
Property of Penn Engineering, Chris Murphy SD4x-4.3
25
<!-- This is files/[Link] -->
<html>
<body>
<h1>Hello!</h1>
<img src="images/[Link]">
<!-- File is files/images/[Link] -->
</body>
</html>
Property of Penn Engineering, Chris Murphy SD4x-4.3
26
<!-- This is files/[Link] -->
<html>
<body>
<h1>Hello!</h1>
<img src="images/[Link]">
<!-- File is files/images/[Link] -->
</body>
</html>
Property of Penn Engineering, Chris Murphy SD4x-4.3
27
Middleware: Serving Static Files
• We can use the response object to send
back specific HTML files as needed
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
28
Middleware: Serving Static Files
• We can use the response object to send
back specific HTML files as needed
var express =
require('express'); varapp =
express();
[Link]('/public',
[Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
29
Middleware: Serving Static Files
• We can use the response object to send
back specific HTML files as needed
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).send('Not found!');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
30
Middleware: Serving Static Files
• We can use the response object to send
back specific HTML files as needed
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
31
Middleware: Serving Static Files
• We can use the response object to send
back specific HTML files as needed
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
32
Middleware: Serving Static Files
• We can use the response object to send
back specific HTML files as needed
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
33
Middleware: Serving Static Files
• We can use the response object to send
back specific HTML files as needed
var express =
require('express'); varapp =
express();
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
Defining and Using Middleware
• Middleware functions can contain any amount
of JavaScript code with any functionality
• They take three parameters: req, res, and
next
• next() must be called at the end of the function
to invoke the next middleware or the final
response
Property of Penn Engineering, Chris Murphy SD4x-4.3 111
35
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
36
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
37
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received
request for ' + url +
' at '
+
time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](3000, () => {
[Link](404).sendFile( dirname +
[Link]('Listening on port 3000');
'/[Link]');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
38
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for ' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
39
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
40
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
41
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
42
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public', [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname +
'/[Link]');
[Link](3000, () => {
});
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
43
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
[Link](logger);
[Link]('/public',
[Link]('files'));
[Link]( /*default*/ (req, res) =>
{ [Link](404).sendFile( dirname +
[Link](3000,
'/[Link]'); () => {
});[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
44
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
// [Link](logger);
[Link]('/public', logger, [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname + '/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
45
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
// [Link](logger);
[Link]('/public', logger, [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname + '/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
46
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
// [Link](logger);
[Link]('/public', logger, [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname + '/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
47
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
// [Link](logger);
[Link]('/public', logger, [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname + '/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
48
var express = require('express');
var app = express();
var logger = (req, res, next) => {
var url = [Link];
var time = new Date();
[Link]('Received request for
' + url +
' at ' + time);
next();
};
// [Link](logger);
[Link]('/public', logger, [Link]('files'));
[Link]( /*default*/ (req, res) => {
[Link](404).sendFile( dirname + '/[Link]');
});
[Link](3000, () => {
[Link]('Listening on port 3000');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
Middleware Chaining
• Middleware functions are called in the order
in which they are specified
• Each uses the same Request and
Response objects
• A middleware function can modify the Request so
that it can then be used by subsequent
middleware functions “downstream” in the route
Property of Penn Engineering, Chris Murphy SD4x-4.3 126
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] =
'Admin'; next();
}
[Link]('/welcome',
nameFinder, greeter,
(req
[Link]('/admin', adminName,
, greeter,
(req,
res res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); } )
(req,
; res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); }
(req,
); res) => { [Link](); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = [Link];
if (name) [Link] = [Link]();
else [Link] = 'Guest';
next();
}
var greeter = (req, res, next) =>
{ [Link](200).type('html');
[Link]('Hello, ' + [Link]);
next();
}
var adminName = (req, res, next) => {
[Link] = 'Admin';
next();
}
[Link]('/welcome', nameFinder,
greeter,
(req, res) =>
[Link]('/admin', adminName, greeter,
{ [Link](); } )
(req,
; res) => { [Link](); } );
SD4x-4.3 127
Middleware, Routes, and Routers
• We may find that the same combinations of
middleware functions are being used in
multiple routes
• We can combine middleware functions into
“sub- routes” using Routers and then use those
in our routes
Property of Penn Engineering, Chris Murphy SD4x-4.3 154
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 155
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 156
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 157
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 158
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 159
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 160
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 161
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 162
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 163
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 164
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 165
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 166
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 167
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 168
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 169
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 170
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 171
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 172
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 173
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 174
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 175
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 176
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 177
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder, header,
greeter, footer, (req, res) => { [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 178
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder,
commonRoute,
(req, res) =>
{ [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 179
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder,
commonRoute,
(req, res) =>
{ [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 180
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder,
commonRoute,
(req, res) =>
{ [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 181
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder,
commonRoute,
(req, res) =>
{ [Link](); } );
[Link]('/admin', logger, adminName, header,
greeter, footer, (req, res) => { [Link](); } );
SD4x-4.3 182
var nameFinder = (req, res, next) => { . . . }
var greeter = (req, res, next) => { . . . }
var adminName = (req, res, next) => { . . . }
var logger = (req, res, next) => { . . . }
var header = (req, res, next) => { . . . }
var footer = (req, res, next) => { . . . }
var commonRoute = [Link]();
[Link](header, greeter, footer);
[Link]('/welcome', logger, nameFinder,
commonRoute,
(req, res) =>
{ [Link](); } );
[Link]('/admin', logger, adminName,
commonRoute, SD4x-4.3 183
Summary
• Routing allows us to specify different
functionality for different HTTP requests
• Routing uses middleware functions, each of
which handles a different part of the functionality
• Middleware functions can be chained together
and can pass values to each other by modifying
the Request object
• Routers allow us to combine middleware
functions into common “sub-routes”
Property of Penn Engineering, Chris Murphy SD4x-4.3 184