You are on page 1of 107

Routing

Node JS
Express Routing
var express = require('express');
var app = express();

app.use('/about', (req, res) => {


res.send('This is the about page.');
});

app.use('/login', (req, res) => {


res.send('This is the login page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 2


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 3


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 4


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 5


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 6


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 7


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 8


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 9


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res)


=> {
app.listen(3000, () => {
res.status(404).send('Not
console.log('Listening
found!'); on port 3000');
});
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 10


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res)


=> {
app.listen(3000, () => {
res.status(404).send('Not
console.log('Listening
found!'); on port 3000');
});
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 11


Express Routing
var express = require('express');
varapp = express();

app.use('/about', (req, res) => {


res.send('This is the about
page.');
});

app.use('/login', (req, res) => {


res.send('This is the login
page.');
});

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('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 express.static,
which serves static files that are locally stored

var express =
require('express'); varapp =
express();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 14


Middleware: Serving Static Files
• The simplest middleware is express.static,
which serves static files that are locally stored

var express = require('express');


var app = express();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});

app.listen(3000, () => {
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 15


Middleware: Serving Static Files
• The simplest middleware is express.static,
which serves static files that are locally stored

var express =
require('express'); varapp =
express();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 16


Middleware: Serving Static Files
• The simplest middleware is express.static,
which serves static files that are locally stored

var express =
require('express'); varapp =
express();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 17


Middleware: Serving Static Files
• The simplest middleware is express.static,
which serves static files that are locally stored

var express =
require('express'); varapp =
express();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 18


Middleware: Serving Static Files
• The simplest middleware is express.static,
which serves static files that are locally stored

var express =
require('express'); varapp =
express();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('Listening on port 3000');
});

Property of Penn Engineering, Chris Murphy SD4x-4.3 19


20
<!-- This is files/index.html -->

<html>
<body>
<h1>Hello!</h1>
<img src="images/kitty.jpg">
<!-- File is files/images/kitty.jpg -->
</body>
</html>

Property of Penn Engineering, Chris Murphy SD4x-4.3


21
<!-- This is files/index.html -->

<html>
<body>
<h1>Hello!</h1>
<img src="images/kitty.jpg">
<!-- File is files/images/kitty.jpg -->
</body>
</html>

Property of Penn Engineering, Chris Murphy SD4x-4.3


22
<!-- This is files/index.html -->

<html>
<body>
<h1>Hello!</h1>
<img src="images/kitty.jpg">
<!-- File is files/images/kitty.jpg -->
</body>
</html>

Property of Penn Engineering, Chris Murphy SD4x-4.3


23
<!-- This is files/index.html -->

<html>
<body>
<h1>Hello!</h1>
<img src="images/kitty.jpg">
<!-- File is files/images/kitty.jpg -->
</body>
</html>

Property of Penn Engineering, Chris Murphy SD4x-4.3


24
<!-- This is files/index.html -->

<html>
<body>
<h1>Hello!</h1>
<img src="images/kitty.jpg">
<!-- File is files/images/kitty.jpg -->
</body>
</html>

Property of Penn Engineering, Chris Murphy SD4x-4.3


25
<!-- This is files/index.html -->

<html>
<body>
<h1>Hello!</h1>
<img src="images/kitty.jpg">
<!-- File is files/images/kitty.jpg -->
</body>
</html>

Property of Penn Engineering, Chris Murphy SD4x-4.3


26
<!-- This is files/index.html -->

<html>
<body>
<h1>Hello!</h1>
<img src="images/kitty.jpg">
<!-- File is files/images/kitty.jpg -->
</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();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('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();

app.use('/public',
express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
app.listen(3000, () => {
});
console.log('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();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).send('Not found!');
});
app.listen(3000, () => {
console.log('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();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
});
app.listen(3000, () => {
console.log('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();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
});
app.listen(3000, () => {
console.log('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();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
});
app.listen(3000, () => {
console.log('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();

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
});
app.listen(3000, () => {
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
app.listen(3000, () => {
});
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
app.listen(3000, () => {
});
console.log('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 = req.url;
var time = new Date();
console.log('Received
request for ' + url +
' at '
+
time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


app.listen(3000, () => {
res.status(404).sendFile( dirname +
console.log('Listening on port 3000');
'/404.html');
});
Property of Penn Engineering, Chris Murphy SD4x-4.3
38
var express = require('express');
var app = express();

var logger = (req, res, next) => {


var url = req.url;
var time = new Date();
console.log('Received request for ' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
});
app.listen(3000, () => {
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
app.listen(3000, () => {
});
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
app.listen(3000, () => {
});
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
app.listen(3000, () => {
});
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public', express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname +
'/404.html');
app.listen(3000, () => {
});
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

app.use(logger);

app.use('/public',
express.static('files'));

app.use( /*default*/ (req, res) =>


{ res.status(404).sendFile( dirname +
app.listen(3000,
'/404.html'); () => {
});console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

// app.use(logger);

app.use('/public', logger, express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname + '/404.html');
});
app.listen(3000, () => {
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

// app.use(logger);

app.use('/public', logger, express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname + '/404.html');
});
app.listen(3000, () => {
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

// app.use(logger);

app.use('/public', logger, express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname + '/404.html');
});
app.listen(3000, () => {
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

// app.use(logger);

app.use('/public', logger, express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname + '/404.html');
});
app.listen(3000, () => {
console.log('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 = req.url;
var time = new Date();
console.log('Received request for
' + url +
' at ' + time);
next();
};

// app.use(logger);

app.use('/public', logger, express.static('files'));

app.use( /*default*/ (req, res) => {


res.status(404).sendFile( dirname + '/404.html');
});
app.listen(3000, () => {
console.log('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 = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username =
'Admin'; next();
}

app.use('/welcome',
nameFinder, greeter,
(req
app.use('/admin', adminName,
, greeter,
(req,
res res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); } )
(req,
; res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); }
(req,
); res) => { res.end(); } );
SD4x-4.3 127
var nameFinder = (req, res, next) => {
var name = req.query.name;
if (name) req.username = name.toUpperCase();
else req.username = 'Guest';
next();
}

var greeter = (req, res, next) =>


{ res.status(200).type('html');
res.write('Hello, ' + req.username);
next();
}

var adminName = (req, res, next) => {


req.username = 'Admin';
next();
}

app.use('/welcome', nameFinder,
greeter,
(req, res) =>
app.use('/admin', adminName, greeter,
{ res.end(); } )
(req,
; res) => { res.end(); } );
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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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) => { . . . }

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder, header,


greeter, footer, (req, res) => { res.end(); } );

app.use('/admin', logger, adminName, header,


greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder,


commonRoute,
(req, res) =>
{ res.end(); } );
app.use('/admin', logger, adminName, header,
greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder,


commonRoute,
(req, res) =>
{ res.end(); } );
app.use('/admin', logger, adminName, header,
greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder,


commonRoute,
(req, res) =>
{ res.end(); } );
app.use('/admin', logger, adminName, header,
greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder,


commonRoute,
(req, res) =>
{ res.end(); } );
app.use('/admin', logger, adminName, header,
greeter, footer, (req, res) => { res.end(); } );

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 = express.Router();


commonRoute.use(header, greeter, footer);

app.use('/welcome', logger, nameFinder,


commonRoute,
(req, res) =>
{ res.end(); } );

app.use('/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

You might also like