Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting...

69
Getting Started with node.js Beardsley (“B”) Ruml [email protected] http://ruml.com 1 Sunday, November 20, 2011

Transcript of Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting...

Page 1: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Getting Started with node.js

Beardsley (“B”) [email protected]

http://ruml.com

1Sunday, November 20, 2011

Page 2: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

probably the most exciting new idea

since Ruby on Railsin 2004

2Sunday, November 20, 2011

Page 3: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js2009

Ryan Dahl

3Sunday, November 20, 2011

Page 4: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What is node.js?

4Sunday, November 20, 2011

Page 5: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What is node.js?a program execution environment for JS

4Sunday, November 20, 2011

Page 6: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

A browser isa program execution environment for JS

5Sunday, November 20, 2011

Page 7: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

The Chrome browser isa program execution environment for JS

6Sunday, November 20, 2011

Page 8: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js isa program execution environment for JS

with access to the local filesystem7Sunday, November 20, 2011

Page 9: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What is node.js?a program execution environment for JS

with event-driven, non-blocking I/O

8Sunday, November 20, 2011

Page 10: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

event-driven:On launch, the program sits in an

event-loop waiting for GUI events to occur; when they do, each event is

placed at the end of an event-queue.

9Sunday, November 20, 2011

Page 11: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

event-driven(2):The program removes each event from the head of the queue and “handles” it

by invoking the event-handler functions which have been bound to

the event.

10Sunday, November 20, 2011

Page 12: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

“event-handler” ==

“callback”

The program “calls back”when the event occurs.

11Sunday, November 20, 2011

Page 13: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

non-blocking I/O:When input is requested (e.g.,

disk-access), the program doesn’t wait for the data from

disk. It continues on with“something else.”

12Sunday, November 20, 2011

Page 14: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

non-blocking I/O:The code to be executed when the diskdata is finally available is placed in a“callback function” and that function

is invoked when the data-availableevent occurs.

13Sunday, November 20, 2011

Page 15: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What is node.js?a program execution environment for JS

with event-driven, non-blocking I/Owritten in C++ and incorporating

Google’s V8 JavaScript engine

[also a set of core modules]

14Sunday, November 20, 2011

Page 16: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Why is it so fast as a network server?

In CGI, each request spawns a new thread with a separate instance of the application: new

interpreter, new initializaton, etc.

In node.js, each request triggers a callback within a single thread (small heap memory allocation)which provides an environment

which can save state.

15Sunday, November 20, 2011

Page 17: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Why is node.js “the future” of web applications?

Web evolution:

• a series of linked static pages;• pages which were dynamically generated from a

database (templating);• pages which send significant amounts of new

data and can ask for updates for parts of a page without refreshing the page (Ajax);• pages which need constant communication;

updates without asking; many browsers talking to each other (chat, backchannel);

16Sunday, November 20, 2011

Page 18: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js core moduleshttpnetchild_processfsos

sysurlutil. . .

17Sunday, November 20, 2011

Page 19: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

require(<module>)

var http = require("http");

[convention: use the same name as module]

18Sunday, November 20, 2011

Page 20: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

a web server in node:

19Sunday, November 20, 2011

Page 21: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

a web server in node:

19Sunday, November 20, 2011

Page 22: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

a web server in node:

19Sunday, November 20, 2011

Page 23: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

what does the call tocreateServer() do?

20Sunday, November 20, 2011

Page 24: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

what does the call tocreateServer() do?

It binds the event-handler function (passed as the parameter) with the

incoming-HTTP-request event.

20Sunday, November 20, 2011

Page 25: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

a web server in node:

but we can chain our calls!

21Sunday, November 20, 2011

Page 26: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

a web server in node:

22Sunday, November 20, 2011

Page 27: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

a web server in node:

what’s wrong here?

22Sunday, November 20, 2011

Page 28: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

a web server in node:

23Sunday, November 20, 2011

Page 29: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

the serverResponse object:

24Sunday, November 20, 2011

Page 30: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

the serverRequest object:

25Sunday, November 20, 2011

Page 31: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

let’s log the requests:

26Sunday, November 20, 2011

Page 32: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

let’s log the requests:

27Sunday, November 20, 2011

Page 33: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

let’s serve a static file:

28Sunday, November 20, 2011

Page 34: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

let’s serve a static file:

29Sunday, November 20, 2011

Page 35: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

let’s serve a static file:

30Sunday, November 20, 2011

Page 36: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Web App Framework:Express

31Sunday, November 20, 2011

Page 37: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

A Chat Application

(the “demo app” of node.js)

32Sunday, November 20, 2011

Page 38: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

How does chat work?

Joe, Sue and Bob all go to the same URL. They navigate to the same “chat room.”

33Sunday, November 20, 2011

Page 39: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

How does chat work?

34Sunday, November 20, 2011

Page 40: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

How does chat work?1. When anyone sends a message, the sender’s ID and the message are displayed in the browsers of all. (In the sender’s browser, the sender is “you.”)

34Sunday, November 20, 2011

Page 41: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

How does chat work?

2. When a new person enters (or leaves) the room, everyone else is notified.

1. When anyone sends a message, the sender’s ID and the message are displayed in the browsers of all. (In the sender’s browser, the sender is “you.”)

34Sunday, November 20, 2011

Page 42: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

How does chat work?

2. When a new person enters (or leaves) the room, everyone else is notified.

3. The newcomer is sent the most recent messages.

1. When anyone sends a message, the sender’s ID and the message are displayed in the browsers of all. (In the sender’s browser, the sender is “you.”)

34Sunday, November 20, 2011

Page 43: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

This isn’t typical client-server!

This requires a: permanently-open bidirectionalchannel.

35Sunday, November 20, 2011

Page 44: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Before HTML5: hacks!

long pollingflash

36Sunday, November 20, 2011

Page 45: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

After HTML5:

websockets!

(a permanently-open bidirectional channel)

37Sunday, November 20, 2011

Page 46: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

websockets for node.js:

socket.io!

5 different transports(including long polling and flash)

38Sunday, November 20, 2011

Page 47: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

JavaScript object syntax:

{ firstName: “John”, lastName: “Brown”, age: 23, children: [ “Sue”, “Bob”], birthdate: [ 1994, 12, 25 ]}

39Sunday, November 20, 2011

Page 48: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

back to the chat app:

What messages do we need to send?

40Sunday, November 20, 2011

Page 49: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What messages do we need to send?1. When anyone sends a message, the sender’s ID and the message are displayed in the browsers of all. (In the sender’s browser, the sender is “you.”)

Message from the sender’s browser:<body>

{ message: [<author>, <body>] }Message from the server to others:

41Sunday, November 20, 2011

Page 50: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What messages do we need to send?

Message from the server to others:

2. When a new person enters (or leaves) the room, everyone else is notified.

{ announcement: <text> }

42Sunday, November 20, 2011

Page 51: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What messages do we need to send?

Message from the server to newcomer:

3. The newcomer is sent the most recent messages.

{ buffer: [ <msg>, <msg>, ... ] }

43Sunday, November 20, 2011

Page 52: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Chat app messages summary:

{ buffer: [ <msg>, <msg>, ... ] }

{ announcement: <text> }

{ message: [<author>, <body>] }

Messages from the server:

Messages from the browser:<body>

44Sunday, November 20, 2011

Page 53: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What has to happen on the server?1. Listen for attempts to connect.

2. When a connection occurs: - create a client object and assign an ID; - bind event-handlers to the events of the client: 1) receipt-of-a-message and 2) disconnecton3. The message event-handler needs to: - add the client’s ID as author; - package author and body into a message object; - sent the message object to everyone else.

45Sunday, November 20, 2011

Page 54: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Let’s look at the server code:

46Sunday, November 20, 2011

Page 55: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

What has to happen on the browser?1. Create a socket object and send a connection request to the server.

2. Bind event-handler to receipt-of-message event.

3. The message event-handler needs to: - for buffer objects: add to chat window in a loop; - otherwise just add to chat window.

47Sunday, November 20, 2011

Page 56: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Let’s look at the browser code:

48Sunday, November 20, 2011

Page 57: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

backchannel

A variation on chat: posts (typically questions for a lecturer) are voted on by all and can be displayed in order of popularity.

http://github.com/bruml2/backchannel

49Sunday, November 20, 2011

Page 58: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js installationhttp://nodejs.org

50Sunday, November 20, 2011

Page 59: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js documentationhttp://nodejs.org/docs/v0.6.2/api/all.html

51Sunday, November 20, 2011

Page 60: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js directorynodecloud.org

52Sunday, November 20, 2011

Page 61: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js tutorialsThe Node Beginner Bookhttp://nodebeginner.org

53Sunday, November 20, 2011

Page 62: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js tutorialsMastering Node

http://visionmedia.github.com/masteringnode/book.html

54Sunday, November 20, 2011

Page 63: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js tutorialsNode Tuts screencastshttp://nodetuts.com

55Sunday, November 20, 2011

Page 64: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js tutorialsHow To Node

http://howtonode.org

56Sunday, November 20, 2011

Page 65: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js booksNode.js in Action (Manning)

57Sunday, November 20, 2011

Page 66: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js booksHands-on node.js

60 pages (of 118) freehttp://nodetuts.com

58Sunday, November 20, 2011

Page 67: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js booksNode Web Development (Packt)

not so good!

59Sunday, November 20, 2011

Page 68: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

node.js HostingJoyent (no.de)

NodejitsuNodesterHeroku

easy; cheap;

60Sunday, November 20, 2011

Page 69: Getting Started with node - CS50cdn.cs50.net/2011/fall/seminars/Node_js/Node_js.pdf · Getting Started with node.js Beardsley (“B”) Ruml b@ruml.com Sunday, November 20, 2011 1

Thanks for listening!

61Sunday, November 20, 2011