8. #SKGNode
Anatomy of a Middleware
app.get(‘/’, function(req, res, next) {/*..
*/});
Request
Object
Response
Object
Pass
Control
9. #SKGNode
The Request Object
● Instantiates per request
● Carries all request information
○ Headers
■ Cookies
○ Request route
○ Parameters (/user/:id), Body, Query
● Propagates Information (i.e. session, auth)
10. #SKGNode
The Response Object
● Instantiates per request
● Carries all respond methods
● Can be build iteratively (CORS, HTTP Code)
● Can terminate a Request
○ .render(), .send(), .end()
○ No ‘next()’ invocation is required
11. #SKGNode
The Flow Control next()
● Express depends on Middleware arity
● If omitted the middleware is Synchronous
● If truthy value is passed fails the request
○ next(‘no go’);
● Invoke once -and only once- to go to next
● If middleware is Terminal do not include it
(i.e. final controller call that renders)
12. #SKGNode
The final route will never be
reached!
app.use(express.static(__dirname + '/public'));
app.use(logger());
app.use(function(req, res){
res.send('Hello');
});
app.get(‘/’, function(req, res){
res.send('World');
});
Sequence MATTERS
Static assets will get served
without generating a Log
15. #SKGNode
// Protect an auth only route
app.get(‘/profile’, function(req, res, next) {
if (!req.user) {
res.status(401).send(‘No go dude’);
return; // .send() is a terminal action
// no need to call next
});
next(); // Client is authed, go on...
});
Leveraging Augmentation
20. #SKGNode
Routing Options
RegEx /^/commits/
(w+)/
“/commits/sdjeo34” → req.params[0] === ‘sdjeo34’
Plain String
‘/’
Triggers on “/”, “/?id=12”, etc
Parametric String
‘/user/:id’
Triggers on “/user/thanpolas” → req.params.id === ‘thanpolas’
Multi Parametric String
‘/user/:network/:id’
Triggers on “/user/skgNode/thanpolas” → req.params.network
Catch All
‘/api/*’
Catches all routes under “/api/”
21. #SKGNode
Routing Best Practices
● Routing is where the buck stops at
● Decouple your routes from your core app
● Study the app.route() pattern
● At the end, there can only be a 404
23. #SKGNode
Defining Paths & Engine
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
Check out all available template engines:
https://github.com/visionmedia/express/wiki#template-engines
24. #SKGNode
Rendering a View
/* GET home page. */
router.get('/', function(req, res) { // no next required
res.render('index', { title: ‘SKGNode’ });
});
extends layout
block content
h1= title
p Welcome to #{title}