23
Building Web Apps with Express By Aaron Stannard Startup Developer Evangelist, Microsoft Corporation

Building Web Apps with Express

Embed Size (px)

DESCRIPTION

An introduction to Express, the Sinatra-inspired MVC framework for Node.JS. You'll learn how Express manages and processes routes, how to use the Jade template engine, and how to design data models aimed to play nice with Express.

Citation preview

Page 1: Building Web Apps with Express

Building Web Apps with Express

By Aaron StannardStartup Developer Evangelist, Microsoft Corporation

Page 2: Building Web Apps with Express

What is Express?

• Sinatra-inspired MVC framework for Node.JS

• Built on Connect Middleware

• Minimalist

Page 3: Building Web Apps with Express

What Express Does

• Parses arguments and headers• Routing• Views– Partials– Layouts

• Configuration• Sessions

Page 4: Building Web Apps with Express

Simple Express Appvar express = require('express');var app = module.exports = express.createServer();

app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public'));});

// Routesrequire('./routes/site')(app);

app.listen(process.env.PORT);console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

Loads Express module

Instantiates Express server

Global Configuration

Loads and binds routes(defined in separate module)

Page 5: Building Web Apps with Express

Getting Started with Express

• Installing Express[local install] C:\> npm install express[global install] C:\> npm install express -g

• Creating Express ApplicationsC:\> express [new project name]C:\> cd [new project name]C:\[new project name]> npm install -dC:\[new project name]> node app.jsExpress server listening on port 3000 in development mode

Page 6: Building Web Apps with Express

Express Project Structure/projectroot/

package.jsonreadme.txtweb/

app.jsviews/layout.jadeindex.jademodels/post.jspublic//images/stylesheets/scripts

test/route-test.jspost-test.js

node_modules/

C:\[projectroot]> node web/app.jsNode server listenening on port 3000 in development mode

Tells Node and NPM what packages are required

The main entry point for the Express application

Data model

Static content

Root of your actual application

Directory for unit tests

Output directory for all NPM installations

Page 7: Building Web Apps with Express

Express Configuration (app.js)app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(sessions({secret: 'adfasdf34efsdfs34sefsdf'})); app.use(app.router); app.use(express.static(__dirname + '/public')); });

app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); });

app.configure('production', function(){ app.use(express.errorHandler()); });

Global configuration setter

Development-environment configurations

Production-environment configurations

View Engine and Views directory

Session Key

Router and Static Content

Page 8: Building Web Apps with Express

Routing//Catch-allapp.all('/app(/*)?', requiresLogin);

// Routesapp.get('/', routes.index);app.get('/about', routes.about);app.get('/contact', routes.contact);app.get('/app/list', routes.listapps);app.get('/app/new', routes.newapp);app.post('/app/new', routes.saveapp);app.get('/app/:app', routes.getapp);app.get('/app/:app/edit', routes.editapp);

Syntax follows the pattern:App.[verb](path, function(req,res), [function(req,res)]);

Catch-all – works for all HTTP verbs

HTTP GET request

HTTP POST request

Accepts :app route argument

Page 9: Building Web Apps with Express

Creating Route Modules (Style 1)

var express = require('express') , routes = require('./routes');

app.get('/', routes.index);

// GET the homepageexports.index = function(req, res){ res.render('index', { title: Home' });};

server.js

route.js

Page 10: Building Web Apps with Express

Creating Route Modules (Style 2)

/* * Module dependencies */

module.exports = function(app){

// GET home page app.get('/', function(req, res){ res.render('index', { title: ‘Home' }) }); }

server.js

routes/site.js

// Routesrequire('./routes/site')(app);

Page 11: Building Web Apps with Express

Request Object

• Req.Param– Req.Query– Req.Body

• Req.Session• Req.Flash• Req.Headers• Can bind usable JSON payloads

Page 12: Building Web Apps with Express

Response Object

• Res.Redirect• Res.Write• Res.End• Res.Download• Local variables and object binding

Page 13: Building Web Apps with Express

Route Pre-Conditions

app.param(‘app’, function(req, res, next, id){appProvider.getAppById(req.session.userName, id,

function(error, app){if(error) return next(error);if(!app) return next(new

Error('Failed to find app with id '+ id));

req.app = app;next();

});});

Page 14: Building Web Apps with Express

Route Filters

//Catch-allapp.all('/app(/*)?', function(req, res, next) { if(req.session && req.session.userName) { next(); } else { res.redirect('/login?redir=' + req.url); }});

Page 15: Building Web Apps with Express

Views

• Support for multiple view engines• Layout support• Partials• Dynamic Helpers

Page 16: Building Web Apps with Express

Jade

• Basic Syntaxul

li a(href='/') Home

• Variablestitle= title

• Conditionalsif flash.info span.info= flash.info

• Iterationseach user in users

div.user_id= user.username

Page 17: Building Web Apps with Express

View Helpersapp.dynamicHelpers({ session: function (req, res) { return req.session; }, flash: function(req, res){ if(typeof(req.session) == 'undefined'){ return undefined; } else{ return req.flash(); } }});

Page 18: Building Web Apps with Express

Session Management

• Session State Providers– Cookie + Back-end Session Store

• Session Cookies– cookie-sessions NPM package

//Assign username of logged in user to sessionreq.session.userName = username;

Page 19: Building Web Apps with Express

Model Structure (OOP)

Provider

DB

Caller

DumbModelDumbModelDumbModel

Asks for models that fitcriteria X

Find matches in persistent store

Mapsto

dumbmodels

Returns to client

Page 20: Building Web Apps with Express

Model Structure (Common)

DB

Caller

SmartModel

Asks for models that fitcriteria X

Find matches in persistent store

Maps to self

Page 21: Building Web Apps with Express

Express on Windows Azure

• Rename app.js to server.js• (You're done)• Caveats– Only a limited number of session state providers– Many popular data stores not available

Page 22: Building Web Apps with Express

Further Reference

• ExpressJS.com - Official Express Homepage• Github.com/visionmedia/jade - Jade• Github.com/senchalabs/connect - Connect• Github.com/WindowsAzure – Azure bits

Page 23: Building Web Apps with Express

About Me

• Aaron Stannard– Twitter: @Aaronontheweb– Github: @Aaronontheweb– Blog: http://www.aaronstannard.com/