35
cocktail d’expérience informatiques Genève 3 & 4 octobre 2011 Seconde édition Track Auteur Session Incubateur M. LEMEE & R. MATON Node.js

soft-shake.ch - Hands on Node.js

Embed Size (px)

Citation preview

Page 1: soft-shake.ch - Hands on Node.js

cocktail d’expérience informatiques

Genève 3 & 4 octobre 2011

Seconde édition

Track

Auteur

Session

Incubateur

M. LEMEE & R. MATON

Node.js

Page 2: soft-shake.ch - Hands on Node.js
Page 3: soft-shake.ch - Hands on Node.js

Node.js

http://nodejs.org

Page 4: soft-shake.ch - Hands on Node.js

Co-founder of Duchess France http://www.java-freelance.fr @MathildeLemee

Creator of Web Tambouille http://www.web-tambouille.fr

@rmat0n

Page 5: soft-shake.ch - Hands on Node.js

Summary

•  What ? Why ? •  Non blocking API example •  Event programming model •  Express, Socket.IO and modules •  Mini Hands On •  Unit Test •  Limits

Page 6: soft-shake.ch - Hands on Node.js

What is Node ?

Server-side Javascript

Node.js javascript implementation is V8 Javascript Engine (Google Chrome)

Provide an easy way to build scalable network programs

Non blocking I/O

Single Threaded

Written by Ryah Dahl

Page 7: soft-shake.ch - Hands on Node.js

What is Node ?

http://codingrelic.geekhold.com/2010/08/nodejs-from-30000-feet.html

Page 8: soft-shake.ch - Hands on Node.js

What is Node ?

var http = require('http'); http.createServer(function (request, response) { res.writeHead(200, {"Content-Type": "text/plain"}); res.end("Hello World\n"); }).listen(1337, "127.0.0.1"); console.log("Server running at http://127.0.0.1:1337/"); ~$ node server.js ~$ curl http://127.0.0.1:1337/

Page 9: soft-shake.ch - Hands on Node.js

Why using Node ?

•  Ryan Dahl: "Node.js project: To provide a purely evented, non-blocking infrastructure to script highly concurrent programs" (http://yuilibrary.com/theater/ryan-dahl/dahl-node/)

•  Scalable software •  Non blocking I/O

•  Same language and share code between server side and client side

•  JSON friendly (web, server, database...)

Page 10: soft-shake.ch - Hands on Node.js

Blocking API example

print("hello"); sleep(2000); print("world");

blocked!!

Page 11: soft-shake.ch - Hands on Node.js

Non blocking API example

var data = File.read("file.txt"); ... // Here you have to wait... maybe a lot... ... // And your thread is still alive... doing nothing... ... parseResult(data);

Page 12: soft-shake.ch - Hands on Node.js

Non blocking API example

var data = File.read("file.txt", function(data) { parseResult(data); }); // Here, your thread is alive and continue working !!! myOtherCode();

Page 13: soft-shake.ch - Hands on Node.js
Page 14: soft-shake.ch - Hands on Node.js

Event programming model

•  Events are the heart of Node.js

•  Everything is event based

•  You can create yours own events

Page 15: soft-shake.ch - Hands on Node.js

Event programming model Sample

dummyEmitter.emit('myCustomEvent', 'myValue'); dummyReceiver.on('myCustomEvent', function(data){ console.log(data); });

Page 16: soft-shake.ch - Hands on Node.js

Event programming model Sample

socket.emit('news', { hello: 'world' }); socket.on('event', function (data) { console.log(data); });

SERVEUR

CLIENT socket.on('news', function (data) { console.log(data); socket.emit('event', { my: 'data' }); });

Page 17: soft-shake.ch - Hands on Node.js

NPM

Page 18: soft-shake.ch - Hands on Node.js
Page 19: soft-shake.ch - Hands on Node.js

Modules

Node Boilerplate

Event Emitter 2

Underscore

Vows

Coffeemate

Node Inspector

Spotify, Twitter, Gravatar, Dropbox, AWS,

https://github.com/joyent/node/wiki/modules

Page 20: soft-shake.ch - Hands on Node.js

Express

var app = express.createServer(); app.get('/', function(req, res) { res.send('Hello World'); }); app.listen(3000);

Web Framework

Inspired by Sinatra (Ruby)

Systèmes de templates (jade, Haml, EJS...)

Page 21: soft-shake.ch - Hands on Node.js

Express

app.configure('development', function() { server.set('views', __dirname + '/views'); server.set('view engine', 'ejs'); app.use(express.static(__dirname + '/public')); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function() { server.set('views', __dirname + '/views'); server.set('view engine', 'ejs'); var aYear = 31557600000; app.use(express.static(__dirname + '/public', { 'maxAge': aYear })); app.use(express.errorHandler()); });

Page 22: soft-shake.ch - Hands on Node.js

Express app.get('/user/:id', function(req, res) { res.send('user' + req.params.id); }); '/users/:id?' /users/5 /users '/user/:id.:format?' /user/12 /user/12.json '/user/:id/:operation?' /user/1 /user/1/edit '/files/*' /files/jquery.js /files/javascripts/jquery.js

Page 23: soft-shake.ch - Hands on Node.js

Socket.IO - Why ?

WebSocket : Firefox 4, Chrome 4, Opera 10.70, and Safari 5.

Asynchronous communication from client to server.

AJAX - XmlHttpRequest ?

Flash / AJAX Long Polling Disconnection

Page 24: soft-shake.ch - Hands on Node.js

Socket.IO - How

var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { io.sockets.emit('info', 'a player join the game'); socket.on('chat', function (msg) { console.log('send a chat', msg); }); socket.on('disconnect', function () { sockets.emit('user disconnected'); }); });

Page 25: soft-shake.ch - Hands on Node.js

Socket.IO - How

<script> var socket = io.connect('http://localhost'); socket.on('connect', function () { socket.on('info', function (data) { alert(data); }); }); socket.emit('chat',myMessage); </script>

Page 26: soft-shake.ch - Hands on Node.js

Socket.IO - How

•  custom messages : socket.emit('my custom event',{data:xxx});

•  volatile : socket.volatile.emit('tweet',tweet);

•  acknoledgements •  broadcast :

socket.broadcast.emit('hello','world'); •  room :

socket.join('justin bieber fans') •  send a message in a room :

io.sockets.in('my room').emit('hello','world'); •  storing data :

socket.set('name','Mathilde',function () { //callback });

Page 27: soft-shake.ch - Hands on Node.js

Modules

Create yours ! hello.js var world = function() { alert("helloworld"); }; exports.world = world; server.js var hello = require("./hello") hello.world();

Page 28: soft-shake.ch - Hands on Node.js

Mini Hands On

Go Mathilde \o/

Page 29: soft-shake.ch - Hands on Node.js

Tests MLE

•  Unit tests o  Node.js provides its own assert module

http://nodejs.org/docs/v0.5.6/api/assert.html o  QUnit (JQuery) http://docs.jquery.com/Qunit o  NodeUnit https://github.com/caolan/nodeunit o  Expresso https://github.com/visionmedia/expresso

•  Integration tests o  Zombie.js http://zombie.labnotes.org

•  Behavior Driven Development o  vowsjs http://vowsjs.org/ o  jasmine-node https://github.com/mhevery/jasmine-node

•  https://github.com/joyent/node/wiki/modules#wiki-testing

Page 30: soft-shake.ch - Hands on Node.js

Unit Tests with QUnit

<script> $(document) .ready( function() { module("1. Game"); test( "Connais la valeur du joueur suivant en fonction du joueur actuel", function() { game = new Game(); game.take(3); game.take(1); equals(game.otherPlayer(), "O", "O est le joueur précédent"); }); ... </script>

Page 31: soft-shake.ch - Hands on Node.js

Unit Tests with QUnit

Page 32: soft-shake.ch - Hands on Node.js

Limits

- Cryptic error messages node.js:50 throw e; ^ Error: ECONNREFUSED, Connection refused at IOWatcher.callback (net:870:22) at node.js:607:9

client.on("error", function (err) { console.log("Error " + err); });

Page 33: soft-shake.ch - Hands on Node.js

Limits

- Cryptic error messages - Only one thread (it is also an advantage) - Can be difficult to read - Non async lib/third party decrease perfs - IDE, Tooling, Debugger, Profiler - How to choose a good module ?

Page 34: soft-shake.ch - Hands on Node.js

Node REPL

~$ node > 1+2 3 > [1, 2, 3].splice(1,2) [2, 3] > process.pid 2998 > ...

Page 35: soft-shake.ch - Hands on Node.js

Links

Quick tour : http://www.slideshare.net/the_undefined/nodejs-a-quick-tour Node + Websockets : http://www.slideshare.net/the_undefined/nodejs-a-quick-tour Node beginner : http://nodebeginner.org/ The Node Beginner Book : https://github.com/ManuelKiessling/NodeBeginnerBook Hands on Node.js : http://nodetuts.com/handson-nodejs-book.html Node.js in Action (été 2012): http://www.manning.com/cantelon