node.js workshopassets.en.oreilly.com/1/event/61/learning node_js presentation 1.pdf · node.js...

173
Chief Evangelist / Node Tech Lead [email protected] @sh1mmer Tom Hughes-Croucher Node.js Workshop

Upload: trantram

Post on 01-Feb-2018

226 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Chief Evangelist / Node Tech Lead

[email protected]@sh1mmer

Tom Hughes-Croucher

Node.js Workshop

Page 2: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Overview• Introduction

• Why Server-Side JavaScript?

• What is Node?

• Using Node

• Understanding Node

• Node Ecosystem

• Programming Style

• More Complex applications

• Deploying Node apps to the cloud

Running order

Page 3: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Introduction

• Tom Hughes-Croucher

• Chief Evangelist at Joyent

• Node.js core contributor

• Author of "Up and Running with Node.js"

Page 4: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Scalable Server-Side Code with JavaScript

Tom Hughes-Croucher

NodeUp and Running

Page 5: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Major update this week

Page 6: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Why Server-SideJavaScript?

Page 7: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

JavaScript programmers

3 > 2 > 1

Page 8: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Massive Code base of jQuery and other JS

libraries

Page 9: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

I could have said efficiency, but I think we all secretly long to sit around in our underwear.

Laziness or “I’m sick of writing stuff twice”

Page 10: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Remember WWCD (What Would Crockford Do)

*close enough

Progressive Enhancement is free*

Page 11: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Like a Unicorn riding a Narwhal

TL;DR:SSJS is Awesome

Page 12: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 13: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

If SSJS is so awesome

why is it "new"?

Page 14: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

1. Professionalism

Page 15: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 16: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

“Yahoo!'s corporate motto is: Don't be

eval().“

Page 17: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

2. JavaScript Runtimes

Page 18: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Runtimes

•V8 (Google), C++

•Spider Monkey (Mozilla), C++

•Rhino (Mozilla), Java

Page 19: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

JavaScript Performance

V8

Spider Monkey

Page 20: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

8x

Sep 08! Mar 11!

Page 21: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Anatomy of SSJS

Page 22: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

!

{Node

Page 23: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Runtime != Browser

Page 24: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

No DOM(By default, anyway)

Page 25: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Summary• Benefits of SSJS

• Lots of JavaScript expertise

• Lots of web code in JS libraries

• Write once, run anywhere

• Progressive Enhancement

• Why SSJS happened now

• Professionalism in JavaScript

• New generation of JavaScript runtimes

Page 26: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

What is Node?

Page 27: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Node• JavaScript programming environment

• Uses V8 runtime

• Event Driven

• Non-blocking libraries

• Supports CommonJS module format

• Supports C/C++ based add-ons

Service behind traffic server

Page 28: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Woah! Overload.

Page 29: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

1. It's JavaScript

Page 30: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

See Above.

Page 31: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

2. It's Fast

Page 32: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

concurrency=300, Smaller is Better

response size (bytes)

response tim

e (

ms)

100

200

300

400

24

26

28

210

212

214

216

218

server

nginxthintornadonode_buffer

Page 33: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 34: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

3. It's easy to extend

Page 35: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

'Modules' in JS'Add-ons' in C

Page 36: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

4. Node is _not_ Rails/Django/etc

Page 37: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Node is bare-bone to the metal

Page 38: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

However, the Node community are making

Rails/Django/etc

Page 39: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

5. Node is young

Page 40: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 41: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Stable is "stable"Unstable moves fast

Page 42: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Using Node

Page 43: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Using Node

• Part 1. Installation

• Part 2. Basics

• Part 3. Getting stuck in

Page 44: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Part 1. Installation

Page 45: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Navea.k.a the easy way

Page 46: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~ $ wget -q http://github.com/isaacs/nave/raw/master/nave.shEnki:~ $ chmod 755 nave.shEnki:~ $ ./nave.sh install latest

Page 47: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

• Installs and versions Node

• Allows Node shells with specific versions

• Allows you to get 'latest' <-- Stable

• May add 'unstable' option in future

Nave

Page 48: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Manual Installation

Page 49: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Go to http://nodejs.org/#download

and get the URL of the current stable release

Page 50: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~ $ wget -q http://nodejs.org/dist/node-v0.4.10.tar.gzEnki:~ $ tar xzf node-v0.4.10.tar.gzEnki:~ $ cd node-v0.4.10Enki:~/node-v0.4.10 $

Page 51: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Local or system?

Page 52: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Local

Page 53: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/node-v0.4.10 $ mkdir ~/localEnki:~/node-v0.4.10 $ ./configure --prefix=~/localChecking for program g++ or c++ : /usr/bin/g++ Checking for program cpp : /usr/bin/cpp...Checking for fdatasync(2) with c++ : no 'configure' finished successfully (3.466s)

Page 54: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/node-v0.4.10 $ makeWaf: Entering directory `/Users/sh1mmer/node-v0.4.10/build'DEST_OS: darwinDEST_CPU: x86Parallel Jobs: 1[ 1/69] cc: deps/libeio/eio.c -> build/default/deps/libeio/eio_1.o/usr/bin/gcc -rdynamic -D_GNU_SOURCE -DHAVE_CONFIG_H=1 -DEV_MULTIPLICITY=0 -pthread -g -O3 -DHAVE_OPENSSL=1 -DX_STACKSIZE=65536 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_FDATASYNC=0 -DPLATFORM="darwin" -DNDEBUG -Idefault/deps/libeio -I../deps/libeio -Idefault -I.. ../deps/libeio/eio.c -c -o default/deps/libeio/eio_1.o...

Page 55: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/node-v0.4.10 $ make installWaf: Entering directory `/Users/sh1mmer/node-v0.4.10/build'DEST_OS: darwinDEST_CPU: x86Parallel Jobs: 1* installing build/default/config.h as /Users/sh1mmer/local/include/node/config.h* installing build/default/node as /Users/sh1mmer/local/bin/node* installing build/default/src/node_config.h as /Users/sh1mmer/local/include/node/node_config.hWaf: Leaving directory `/Users/sh1mmer/node-v0.4.10/build''install' finished successfully (0.373s)Enki:~/node-v0.4.7 $

Page 56: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/node-v0.4.10 $ echo $PATH/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/git/bin:/Users/croucher/Code/narwhal/bin:/opt/local/bin:/usr/local/git/bin:/Users/sh1mmer/binEnki:~/node-v0.4.10 $ node -v-bash: node: command not foundEnki:~/node-v0.4.10 $ echo PATH=~/local/bin:\$PATH >> ~/.profileEnki:~/node-v0.4.10 $ node -vv0.4.10

Page 57: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

System

Page 58: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/node-v0.4.10 $ ./configure...Enki:~/node-v0.4.10 $ make...Enki:~/node-v0.4.10 $ sudo make install...Enki:~/node-v0.4.10 $ node -vv0.4.7Enki:~/node-v0.4.10 $

Page 59: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

•Get Node head from Github using Git

• Install to ~/node

Exercise

Page 60: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Part 2. Basics

Page 61: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Interactive JavaScript terminal

node-repl

Page 62: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

$Enki:~ $ node

Page 63: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

$Enki:~ $ node> 3 > 2 > 1false> true == 1true> true === 1false

Page 64: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

> console.log('Hello World');Hello World> .help.clear Break, and also clear the local context..exit Exit the prompt.help Show repl options> .clearClearing context...> .exitEnki:~ $

Page 65: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~ $ node> var foo = "bar";> foo;'bar'> .clearClearing context...> fooReferenceError: foo is not defined at [object Context]:1:1 at Interface.<anonymous> (repl:98:19) at Interface.emit (events:27:15) at Interface._ttyWrite (readline:295:12) at Interface.write (readline:132:30) at Stream.<anonymous> (repl:79:9) at Stream.emit (events:27:15) at IOWatcher.callback (net:489:16)

Page 66: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var http = require('http');http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}).listen(8124, "127.0.0.1");console.log('Server running at http://127.0.0.1:8124/');

Page 67: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var http = require('http');

//include the http library

Page 68: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

http.createServer(function (req, res) {

}).listen(8124, "127.0.0.1");

//create an http server//when ‘stuff’ happens call this anonymous function//listen on port 8124 of the IP 127.0.0.1

Page 69: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');})

//when ‘stuff’ happens my function fires//I get a request object and a response object//I write to the response object header//HTTP status 200 and content-type ‘text/plain’//close the response with the body://Hello World

Page 70: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

console.log('Server running at http://127.0.0.1:8124/');

//write Server is running at http://127.0.0.1:8124///to the console

Page 71: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Interactive Debugging

Page 72: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/Code/node-examples $ node --debug helloworld.js debugger listening on port 5858Server running at http://127.0.0.1:8124/

Page 73: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 74: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 75: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 76: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 77: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 78: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 79: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~ $ npm install [email protected] ./node_modules/node-inspector ├── [email protected]└── [email protected]:~ $ node-inspector visit http://0.0.0.0:8080/debug?port=5858 to start debugging

Page 80: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules
Page 81: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Exercises

• Modify the HTTP server to return the text "I'm learning Node"

• Change the HTTP response to HTML and return your text in an HTML page

• Return the User-Agent string from the browser as part of your HTML page

• Return different textual responses to 2 (or more) browsers

Page 82: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Part 3. Getting Stuck In

Page 83: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

HTTP Client

Page 84: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var http = require('http');

var request = http.request({'host': 'www.google.com', 'port': 80, 'path': '/', 'method':'GET'});request.on('response', function (response) { console.log('STATUS: ' + response.statusCode); console.log('HEADERS: ' + JSON.stringify(response.headers)); response.setEncoding('utf8'); response.on('data', function (chunk) { console.log('BODY: ' + chunk); });

Page 85: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Streaming API

Page 86: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

write(data)

write(data)

end()

response(headers)

Response

Destination(google.com)Request

data(chunk)data(chunk)data(chunk)

end()

Page 87: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Exercise•Fetch the NYTimes.com and output

the contents to the console

•Create a web server

•Create an HTTP client

•POST data to your web server

•Output the POST data to console

Page 88: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Events

Page 89: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

object.on('event', function() { //stuff} );

Page 90: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

EventEmitter

Page 91: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

EventEmitter

•manage "event handlers"

• list of functions to be called per event

•provide mechanism to trigger events

Page 92: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var util = require('util'), EE = require('events').EventEmitter;

util.inherits(MyClass, EE);

var myObj = new MyClass();

//nb using first class functionsmyObj.on('something', function);

Page 93: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

exports.inherits = function (ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false } });};

Page 94: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

More than just core

Page 95: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

CommonJS Modules

Page 96: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Library format for SSJS

Page 97: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var inc = require('increment').increment;var a = 1;inc(a); // 2

exports.add = function() { var sum = 0, i = 0, args = arguments, l = args.length; while (i < l) { sum += args[i++]; } return sum;};

var add = require('math').add;exports.increment = function(val) { return add(val, 1);};

math.js

increment.js

Page 98: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Protipexports.awesome = function() { //yay my code is awesomesauce};

var exports.fail = function() { //exports is a global //by redeclaring it as //a local variable //your code _will_ fail };

Page 99: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Exercise• Create a CommonJS module called "fish"

• Provide functions to:

• swim

• mouth breath

• flop around

• Import your module into a node project

• Call the various functions

Page 100: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Node Package Manager (NPM)

Page 101: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

NPM is written in JavaScript for Node

Page 102: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~ $ cat `which npm`#!/usr/bin/env node;(function () { // wrapper in case we're in module_context modevar log = require("../lib/utils/log")log.waitForConfig()log.info("ok", "it worked if it ends with")

var fs = require("../lib/utils/graceful-fs") , path = require("path") , sys = require("../lib/utils/sys") , npm = require("../npm") , ini = require("../lib/utils/ini") , rm = require("../lib/utils/rm-rf")

Page 103: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/Code/node(master) $ npm install [email protected] ../../node_modules/express ├── [email protected]├── [email protected]└── [email protected]:~/Code/node(master) $

Page 104: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Yay. Easy.

Page 105: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Install instructionshttps://github.com/isaacs/npm

Page 106: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Express.js

Page 107: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Sinatra Style MVC framework

Page 108: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var app = require('express').createServer();

app.get('/', function(req, res){ res.send('hello world');});

app.listen(3000);

Page 109: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

HTTP Verb Oriented

Page 110: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Middleware

Page 111: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.use(express.bodyParser());app.use(express.cookieParser());

app.post('/', function(req, res){ // Perhaps we posted several items with a form // (use the bodyParser() middleware for this) var items = req.body.items; console.log(items); res.send('logging');});

Page 112: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Templating

Page 113: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var express = require("express");

app.configure(function () { var public = __dirname + "/../public/"; public = require("path").normalize(public);

app.set("views", __dirname + "/views"); app.set("view engine", "jade");});

app.get("/", function (req, res) { res.render("index", { locals : { h1: 'Router Stats', scripts : [ "/public/smoothie.js", "/public/raphael.js", "/public/base.js", "/public/gfx.js", "/public/explore.js", "/public/app.js" ] } }});

Page 114: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

•Create an Express server

•Serve two different pages based on value of the HTTP Get param "page"

•Create a redirect from /old to /new

•Set a cookie on the client

Exercise

Page 115: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Express in depth

Page 116: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Routes

• Routes are based on verbs

• GET

• POST

• PUT

• DELETE

• ALL (not a real verb, but obvious)

Page 117: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Simple routes

Page 118: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get(‘/’, function(req,res) { res.send(‘hello root’);});

Page 119: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Routes with variables

Page 120: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get(‘/user/:id’, function(req,res) { res.send(‘hello ‘ + req.params.id);});

Page 121: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Optional flags in routes

Page 122: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get(‘/:filename?’, function(req,res) { if(req.params.filename) { res.send(req.params.filename); } else { res.send(‘root’); }});

Page 123: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Regex as routes

Page 124: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get(/\//, function(req, res) { //like using ‘/’ ? res.send(‘/’);});

Page 125: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get(/^\/\d+\/?$/, function(req,res) { res.send(‘matches a number’);});

Page 126: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get(/^\/(.+)\/?$/, function(req,res) { //note translation of %23, etc res.send(‘Got: ’ + req.params[0]); //also captures become an array});

Page 127: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Using regex to define parameters

Page 128: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get(‘/index.:format((html|json))’,function(req,res) { res.send('Got: ' + req.params.format);});

Page 129: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get('/:id(\d+)', function(req,res) { //only digits, right? res.send(req.params.id);});

Page 130: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get('/:id(\\d+)', function(req,res) { //escape your \ in strings res.send(req.params.id);});

Page 131: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

function normalizePath(path, keys) { path = path .concat('/?') .replace(/\/\(/g, '(?:/') .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g, function(_, slash, format, key, capture, optional){ keys.push(key); slash = slash || ''; return '' + (optional ? '' : slash) + '(?:' + (optional ? slash : '') + (format || '') + (capture || '([^/]+?)') + ')' + (optional || ''); }) .replace(/([\/.])/g, '\\$1') .replace(/\*/g, '(.+)'); return new RegExp('^' + path + '$', 'i');}

Routing magic: Router.js

Page 132: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Routing magic• If . before :variable? then . is also optional

• If ? is not after a variable then only the previous character is affected

• / at the end of URLs automatically optional

• * Can be used as a wildcard in routes

• Includes when end of URL is optional

e.g. '/app/e?'

• Regex can be used any place in a route string

e.g. '/app/(\\d)r?'

Page 133: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Exercises• Create an express app with routes that capture '/'

'/products' and '/services'

• Create a route that captures the product ID after '/product/' e.g. '/product/abc12' and returns it in the response

• Use a regular expression to restrict the ID parameter to 3 letter followed by 3-5 numbers

• Create a route using a regex that matches the entire route

Page 134: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Passing Control

• Routes are actually 'stacked middleware'

• You can pass control between routes

• The next() function calls the next matching route

Page 135: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get('/users/:id', function(req, res, next){ var id = req.params.id;

if (checkPermission(id)) { // show private page } else { next(); }});

app.get('/users/:id', function(req, res){ // show public user page });

Page 136: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Passing Control

• next() is a function of router (and defined in the closure containing the route)

• router will grab routes in the order they were declared

• e.g. since'/*' will match everything so it should be the last route!

• router doesn't care about verbs so you can use all() to operate on all verbs/routes and then use next() to pass to get(), put(), etc

Page 137: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Exercises

• Create a simple check for correct product IDs if not pass control to a route showing a custom error page

• Use app.all() to check user permission before showing (mock-up) edit controls on a web site

Page 138: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Middleware

Page 139: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

It's a pattern

Page 140: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

next()

next()

next()

req, res

Page 141: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

next()

next()

next()

Dispatcher

req

res

req, res

Page 142: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

req, res, next

Page 143: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var express = require('express'), app = express.createServer();

var middleware = function (req, res, next) { req.foo = 'bar'; next();};

app.use(middleware);

app.get('/', function(req, res) { res.send(req.foo);

Page 144: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var express = require('express'), app = express.createServer();

var middleware = function (req, res, next) { var send = res.send; res.send = function(d) { res.send = send; res.send('hijacked! ' + d); } next();};

app.use(middleware);

app.get('/', function(req, res) { res.send('hi');});

Page 145: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

• logger

• bodyParser

• cookieParser

• session

• static

• errorHandler

• profiler

• responseTime

• basicAuth

• favicon

• vhost

Connect middleware(Renamed express.* for convenience)

Page 146: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var express = require('express'), app = express.createServer();

app.use(express.logger());app.use(express.bodyParser());app.use(express.cookieParser());app.use(app.router);app.use(express.static(__dirname + '/images'));app.use(express.errorHandler());

app.get('/', function(req, res) { res.send('<html><img src="/image.png"></html');});

app.listen(9003);

Page 147: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Ordering matters

Page 148: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Router uses "internal

middleware"

Page 149: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var express = require('express'), app = express.createServer();

var middleware = function (req, res, next) { req.foo = 'bar'; next();};

app.get('/', middleware, function(req, res) { res.send(req.foo);});

Page 150: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var a, b, c, d;a = b = c = d = function(req,res,next) { next();}

var set1 = [a,b];var set2 = [c,d];var all = [set1, set2];

app.get('/set1', set1, function(req,res) { res.send('output');});app.get('/set2', [c,d], function(req,res) { res.send('output');});app.get('/all', all, function(req,res) { res.send('output');});

Page 151: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Middleware factories

Page 152: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Middleware are just functions

Page 153: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var a, b, c, d;a = b = c = d = function(req,res,next) { next();}

var set1 = [a,b];var set2 = [c,d];var all = [set1, set2];

app.get('/set1', set1, function(req,res) { res.send('output');});app.get('/set2', [c,d], function(req,res) { res.send('output');});app.get('/all', all, function(req,res) { res.send('output');});

Page 154: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

var mFactory = function(letter) { return function(req,res,next) { var send = res.send; res.send = function(d) { res.send = send; res.send(letter + ' ' + d); } next(); }};

var set1 = [mFactory('a'),mFactory('b')];var set2 = [mFactory('c'),mFactory('d')];var all = [set1, set2];

app.get('/set1', set1, function(req,res) { res.send('output');});app.get('/set2', set2, function(req,res) { res.send('output');});app.get('/all', all, function(req,res) { res.send('output');});

Page 155: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

• Create a middleware to detect mobile phone browsers and attach a boolean to req

• Create an express app that serves up links to an image using staticProvider

• Modify Profiler to profile your app and write each profile to a log file

• Create a middleware factory that sets the HTTP Expires header based on roles

Exercise

Page 156: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Error handling

Page 157: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

function NotFound(msg){ this.name = 'NotFound'; Error.call(this, msg); Error.captureStackTrace(this, arguments.callee);}

NotFound.prototype.__proto__ = Error.prototype;

app.get('/404', function(req, res){ throw new NotFound;});

app.get('/500', function(req, res){ throw new Error('keyboard cat!');});

Page 158: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.error(function(err, req, res, next){ if (err instanceof NotFound) { res.render('404.jade'); } else { next(err); }});

Page 159: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

View Rendering

Page 160: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.get('/', function(req, res){ res.render('index.ejs', { title: 'Falsy Demo' });});

Page 161: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Enki:~/Code/express-demo $ tree.├── app.js├── lib├── public└── views ├── index.ejs ├── layout.ejs ├── layout1.ejs └── partials └── stylesheet.ejs

4 directories, 5 filesEnki:~/Code/express-demo $

Page 162: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

npm install ejsnpm install jade

Don't forget to install

Page 163: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <title><%= title %></title> </head> <body> <%- body %> </body></html>

layout.ejs

Page 164: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

• layout is a framework unless you turn it off

•body is a special variable for layout referring to the file specified

Page 165: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

app.set('view engine', 'ejs');

app.get('/', function(req,res) { res.render('index', { title:'Falsy Demo'});});

Page 166: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

//global

app.set('view options'), { layout: false;});

//or per route

res.render(index, {layout: false});

Page 167: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Partial views

Page 168: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

View Partials

•Repeating elements

•Take a collection

• Iterate over the collection

•"Built in" variables for managing collections

Page 169: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <%- partial('stylesheet', stylesheets) %> <title><%= title %></title> </head> <body> <h1><%= header %></h1> <%- body %> </body></html>

layout.ejs

Page 170: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

partials/stylesheet.ejs

<link rel="stylesheet" type="text/css" href="<%- stylesheet %>">

Page 171: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

res.render('index', { locals: {'title': title, 'header': header, 'content': content, stylesheets: ['/public/style.css'] }, });

Page 172: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

• Create an express server that use jade, haml, ejs to render an index page

• Create a public folder and include file from it (CSS, images, etc) in your layout

• Create a route for '/blog/id' to accept only digits

• Make a 'fake database' (array) of blog posts and use a middleware to validate each id is valid

• Create a view for the '/blog/id' show the correct post

• Use a view partial to a preview of each blog post on the index page

Exercises

Page 173: Node.js Workshopassets.en.oreilly.com/1/event/61/Learning Node_js Presentation 1.pdf · Node.js Workshop. Overview ... nginx thin tornado node_buffer. 3. It's easy to extend 'Modules

Questions