SlideShare a Scribd company logo
1 of 37
Download to read offline
Node.js
Building Fast, Modern Web 2.0 Applications
Joe Einertson
University of Minnesota, Morris

October 30, 2013
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Table of Contents

1

What is Node?

2

CoffeeScript

3

Node Basics

4

Node in Practice

5

Conclusion

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

What is Node?

1

What is Node?
Background
The Old Way
The New Way

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

What is Node.js?

Network application framework built on Google’s V8
JavaScript engine
Released in 2009, now widely used (Yahoo, Microsoft, eBay,
LinkedIn, etc.)
Designed for scalability and performance
Single-threaded concurrency model

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

The Old Way

Older model of server design:
One thread per client
2MB per thread
I/O either blocks, is manually async, or is async through
external library
Large set of tools/capabilities built in

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

The New Way

Node (and other newer frameworks like Akka, Vert.x, Tornado,
etc.) use a different model:
One thread, total
Non-blocking, event-driven I/O
Event loop drives entire server
Barebones
Goal: 10,000 concurrent connections

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

Benefits of the New Way

Much less overhead per user
No concurrency = no concurrency bugs
Scaling is easy
Really fast

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

Benefits of Node

Some benefits are specific to Node:
Underlying engine is fast, mature and well-maintained
Same language on server and client (!)

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Background
The Old Way
The New Way

CPU-intensive = I/O

So, how do we handle CPU-intensive work? Turn it into I/O!
Spin off new process
Yield control
Resume when computation finished
Result is asynchronous and efficient

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

CoffeeScript

2

CoffeeScript
What is CoffeeScript?
CoffeeScript in 10 Minutes

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

What is CoffeeScript?

First released in 2009
Syntax inspired by Python
Transcompiles to easily readable JavaScript
Seeing wider adoption with popularity of Node.js

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

CoffeeScript Basics
Example
# Variables aren’t typed or declared
x = 2 + 2
# Everything is an expression
height = if isMobile then 300 else 800
# As in JS, easily declare arrays and objects
arr = [1, 2, 3]
obj = {year: 2004, model: "Camry"}

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

CoffeeScript Functions
Example
# Functions are declared with () ->
# Last value implicitly returned
square = (x) -> x * x
# Indentation is used instead of braces
area = (r) ->
if r <= 0
0
else
pi = 3.14
pi * r * r
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

More CoffeeScript
Example
# Parentheses are optional in function calls
Math.pow(2, n) == Math.pow 2, n
# Useful for functional-style invocations
squares = util.map [1, 2, 3], (x) -> x * x
# String interpolation is awesome...
console.log "#{x} + #{y} = #{x+y}"
# ...especially when compared to vanilla JS strings
console.log "" + x + " + " + y + " = " + (x + y)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

Destructuring Assignment...?

Example
# Quickly assign multiple values
[quotient, remainder] = divide 7, 3
# Take apart and put together objects easily
{age, name} = dbResult
x = 3
point = {x, y: 4}

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

What is CoffeeScript?
CoffeeScript in 10 Minutes

Classes!
CoffeeScript has classes!
Example
class Point
# Automatically assign params to instance fields
constructor: (@x, @y) ->
@sum = x + y
difference: ->
@x - @y
p = new Point(4, 5)
x.difference() # -1
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Node Basics

3

Node Basics
Hello World
Basic Web Server
Show me the I/O

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Hello World

Example
net = require ’net’
net.createServer (stream) ->
stream.write ’Hello World!rn’
stream.pipe stream
.listen(8000)

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Hello World
Example
http = require ’http’
http.createServer (request, response) ->
# 200 = HTTP ’everything OK’ status
response.writeHead 200,
{’Content-Type’: ’text/plain’}
response.end ’Hello World!’
.listen(8000)
Response time: <1 ms
Apache response time: 100 ms
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Hello World
Basic Web Server
Show me the I/O

Asynchronous I/O
Example
http = require ’http’
db = require ’./server/db.coffee’
http.createServer (request, response) ->
query = ’SELECT * FROM STOCK;’
db.request query, (err, stock) ->
return sendError response, 500 if err
response.writeHead 200, { ... }
response.end stock.toString()
.listen(8000)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Node in Practice

4

Node in Practice
Libraries
express
Socket.IO
Backbone
swig

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Libraries
Web server framework: express
Async control flow: async
Client-server sync + MVC: Backbone
”Push” framework: Socket.IO
Client library: jQuery/Prototype
Templates: swig/Mustache/Hogan
Utilities: Underscore
Libraries and dependencies handled with Node Package Manager
(npm)

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

express
express is a widely used wrapper over the built-in Node HTTP
library.
Example
express = require ’express’
app = express()
app.get ’/news/:slug’, (req, res) ->
res.send "You want the news about #{req.slug}!"
app.get ’/*’, (req, res) ->
res.sendfile ’index.html’
app.listen(8000)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Socket.IO
Socket.IO provides a ”push” framework - essentially, a pipe
between server and client.
Example (Server)
socketIO = require ’socket.io’
io = socketIO.listen(app)
io.on ’connection’, (socket) ->
ClientManager.add socket
socket.on ’getData’, (username) ->
socket.emit ’data’, cache.findPerson(username)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Socket.IO

Example (Client)
socket = io.connect ’http://localhost’
socket.emit ’getData’, auth.getUsername()
socket.on ’data’, (personData) ->
...

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone
Backbone provides the client a MVC model as well as automatic
client-server syncing.
Example (Models)
class Message extends Backbone.Model
initialize: ->
@on ’change:message’, ’addEditMsg’
addEditMsg: ->
newMsg = "#{ @get ’message’ } (Edited)"
# Use silent: true to prevent infinite loop
@set {message: newMsg}, {silent: true}
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone
Example (Views)
class MessageView extends Backbone.View
tagName: ’div’
className: ’message’
template: ’message’
events:
’click .name’: ’showMsgAuthor’
initialize: ->
@listenTo @model, ’change’, @render

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone
Example (Views)
class MessageView extends Backbone.View
# Even complex rendering is easy with Backbone
render: ->
data =
time: @get(’time’).toLocaleString()
color:
if @get(‘byAdmin’)
’red’
else
’white’
super(data)
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Backbone

Example (All Together Now)
# Make a model...
model = new Message(data)
# ...make a view for that model...
view = new MessageView({ model })
# ...and insert it into the document
$(’.messages’).append view.render().el

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Libraries
express
Socket.IO
Backbone
swig

Templates with Swig
Building views with templates is easy.
Example (message.html)
From: {{ name }}<br />
Date: {{ time }}<br />
{{ message }}
Example (Client or Server)
msgTemplate = swig.compile rawTemplate
msg = msgTemplate(msgData)
$(’body’).append msg # Client only
Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Conclusion

5

Conclusion
Webapp Demo
Tying It All Together
More Resources
Questions

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

App Demo

Simple webchat app
Multi-user chat
Changes propagate between server and all clients
Very little implementation logic
99% business logic

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

How Big?

Server: 200 lines
Client: 100 lines
HTML: 40 lines
CSS: 30 lines

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Why Node?

Runs fast
Codes fast
Scales
Cross-platform
Huge library ecosystem

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Why CoffeeScript?

Compatible with JS
Cleans up JS syntax
About 30% shorter than equivalent JS code

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

More Resources

Node’s own ”why?”: http://nodejs.org/about
The C10K problem: http://www.kegel.com/c10k.html
My app’s code:
https://github.com/royaldark/node-chat-demo
Everything Node, by popularity: http://www.nodecloud.org

Joe Einertson

Node.js
What is Node?
CoffeeScript
Node Basics
Node in Practice
Conclusion

Webapp Demo
Tying It All Together
More Resources
Questions

Questions

Any questions?

Joe Einertson

Node.js

More Related Content

What's hot

Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Esun Kim
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Expressjguerrero999
 
Node.js Patterns for Discerning Developers
Node.js Patterns for Discerning DevelopersNode.js Patterns for Discerning Developers
Node.js Patterns for Discerning Developerscacois
 
Building your first Node app with Connect & Express
Building your first Node app with Connect & ExpressBuilding your first Node app with Connect & Express
Building your first Node app with Connect & ExpressChristian Joudrey
 
Nodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web ApplicationsNodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web ApplicationsGanesh Iyer
 
A Taste of Clojure
A Taste of ClojureA Taste of Clojure
A Taste of ClojureDavid Leung
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.jsConFoo
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.jsVikash Singh
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node jsfakedarren
 
Intsllation & 1st program nodejs
Intsllation & 1st program nodejsIntsllation & 1st program nodejs
Intsllation & 1st program nodejsmonikadeshmane
 
Harder Faster Stronger
Harder Faster StrongerHarder Faster Stronger
Harder Faster Strongersnyff
 
JVM Dive for mere mortals
JVM Dive for mere mortalsJVM Dive for mere mortals
JVM Dive for mere mortalsJakub Kubrynski
 
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010Heiko Behrens
 
Node.js: A Guided Tour
Node.js: A Guided TourNode.js: A Guided Tour
Node.js: A Guided Tourcacois
 
Recipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with XtendRecipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with XtendKarsten Thoms
 

What's hot (20)

Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Express
 
Node.js Patterns for Discerning Developers
Node.js Patterns for Discerning DevelopersNode.js Patterns for Discerning Developers
Node.js Patterns for Discerning Developers
 
Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJS
 
Building your first Node app with Connect & Express
Building your first Node app with Connect & ExpressBuilding your first Node app with Connect & Express
Building your first Node app with Connect & Express
 
Nodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web ApplicationsNodejs Event Driven Concurrency for Web Applications
Nodejs Event Driven Concurrency for Web Applications
 
A Taste of Clojure
A Taste of ClojureA Taste of Clojure
A Taste of Clojure
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.js
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node js
 
Intsllation & 1st program nodejs
Intsllation & 1st program nodejsIntsllation & 1st program nodejs
Intsllation & 1st program nodejs
 
Harder Faster Stronger
Harder Faster StrongerHarder Faster Stronger
Harder Faster Stronger
 
Node ppt
Node pptNode ppt
Node ppt
 
JVM Dive for mere mortals
JVM Dive for mere mortalsJVM Dive for mere mortals
JVM Dive for mere mortals
 
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
Plattformübergreifende App-Entwicklung (ein Vergleich) - MobileTechCon 2010
 
Node.js 0.8 features
Node.js 0.8 featuresNode.js 0.8 features
Node.js 0.8 features
 
Node.js: A Guided Tour
Node.js: A Guided TourNode.js: A Guided Tour
Node.js: A Guided Tour
 
Intro to Sail.js
Intro to Sail.jsIntro to Sail.js
Intro to Sail.js
 
Nodejs intro
Nodejs introNodejs intro
Nodejs intro
 
Recipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with XtendRecipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with Xtend
 

Viewers also liked

DK Resume desk and dev
DK Resume desk and devDK Resume desk and dev
DK Resume desk and devDerek Knoblich
 
A Designer's Intro to Oracle JET
A Designer's Intro to Oracle JETA Designer's Intro to Oracle JET
A Designer's Intro to Oracle JETLauren Beatty
 
Working with LoopBack Models
Working with LoopBack ModelsWorking with LoopBack Models
Working with LoopBack ModelsRaymond Feng
 
Building a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 MinutesBuilding a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 MinutesRaymond Feng
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRaymond Camden
 

Viewers also liked (6)

DK Resume desk and dev
DK Resume desk and devDK Resume desk and dev
DK Resume desk and dev
 
A Designer's Intro to Oracle JET
A Designer's Intro to Oracle JETA Designer's Intro to Oracle JET
A Designer's Intro to Oracle JET
 
Who I am.doc
Who I am.docWho I am.doc
Who I am.doc
 
Working with LoopBack Models
Working with LoopBack ModelsWorking with LoopBack Models
Working with LoopBack Models
 
Building a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 MinutesBuilding a Node.js API backend with LoopBack in 5 Minutes
Building a Node.js API backend with LoopBack in 5 Minutes
 
Rapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoopRapid API Development with LoopBack/StrongLoop
Rapid API Development with LoopBack/StrongLoop
 

Similar to Building Fast, Modern Web Applications with Node.js and CoffeeScript

Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiJackson Tian
 
Why Node.js
Why Node.jsWhy Node.js
Why Node.jsguileen
 
Streams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetupStreams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetupBrian Cardiff
 
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav DukhinFwdays
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch
 
The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015rvagg
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backendDavid Padbury
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS drupalcampest
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends旻琦 潘
 
EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008geraldbauer
 
Modern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaumModern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaumgeektimecoil
 
Top 30 Node.js interview questions
Top 30 Node.js interview questionsTop 30 Node.js interview questions
Top 30 Node.js interview questionstechievarsity
 
Asterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesAsterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesDan Jenkins
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdfhamzadamani7
 
Introduction to node.js GDD
Introduction to node.js GDDIntroduction to node.js GDD
Introduction to node.js GDDSudar Muthu
 
Webconf nodejs-production-architecture
Webconf nodejs-production-architectureWebconf nodejs-production-architecture
Webconf nodejs-production-architectureBen Lin
 

Similar to Building Fast, Modern Web Applications with Node.js and CoffeeScript (20)

Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin Shanghai
 
Why Node.js
Why Node.jsWhy Node.js
Why Node.js
 
Streams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetupStreams of information - Chicago crystal language monthly meetup
Streams of information - Chicago crystal language monthly meetup
 
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
 
Node.JS briefly introduced
Node.JS briefly introducedNode.JS briefly introduced
Node.JS briefly introduced
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 
The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015The Future of Node - @rvagg - NodeConf Christchurch 2015
The Future of Node - @rvagg - NodeConf Christchurch 2015
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
Node js
Node jsNode js
Node js
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS
 
NodeJS for Beginner
NodeJS for BeginnerNodeJS for Beginner
NodeJS for Beginner
 
Node azure
Node azureNode azure
Node azure
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends
 
EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008EuRuKo JRuby Talk 2008
EuRuKo JRuby Talk 2008
 
Modern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaumModern server side development with node.js - Benjamin gruenbaum
Modern server side development with node.js - Benjamin gruenbaum
 
Top 30 Node.js interview questions
Top 30 Node.js interview questionsTop 30 Node.js interview questions
Top 30 Node.js interview questions
 
Asterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilitiesAsterisk, HTML5 and NodeJS; a world of endless possibilities
Asterisk, HTML5 and NodeJS; a world of endless possibilities
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
 
Introduction to node.js GDD
Introduction to node.js GDDIntroduction to node.js GDD
Introduction to node.js GDD
 
Webconf nodejs-production-architecture
Webconf nodejs-production-architectureWebconf nodejs-production-architecture
Webconf nodejs-production-architecture
 

Recently uploaded

Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfngoud9212
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsHyundai Motor Group
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxnull - The Open Security Community
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 

Recently uploaded (20)

Bluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdfBluetooth Controlled Car with Arduino.pdf
Bluetooth Controlled Car with Arduino.pdf
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 

Building Fast, Modern Web Applications with Node.js and CoffeeScript

  • 1. Node.js Building Fast, Modern Web 2.0 Applications Joe Einertson University of Minnesota, Morris October 30, 2013
  • 2. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Table of Contents 1 What is Node? 2 CoffeeScript 3 Node Basics 4 Node in Practice 5 Conclusion Joe Einertson Node.js
  • 3. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way What is Node? 1 What is Node? Background The Old Way The New Way Joe Einertson Node.js
  • 4. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way What is Node.js? Network application framework built on Google’s V8 JavaScript engine Released in 2009, now widely used (Yahoo, Microsoft, eBay, LinkedIn, etc.) Designed for scalability and performance Single-threaded concurrency model Joe Einertson Node.js
  • 5. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way The Old Way Older model of server design: One thread per client 2MB per thread I/O either blocks, is manually async, or is async through external library Large set of tools/capabilities built in Joe Einertson Node.js
  • 6. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way The New Way Node (and other newer frameworks like Akka, Vert.x, Tornado, etc.) use a different model: One thread, total Non-blocking, event-driven I/O Event loop drives entire server Barebones Goal: 10,000 concurrent connections Joe Einertson Node.js
  • 7. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way Benefits of the New Way Much less overhead per user No concurrency = no concurrency bugs Scaling is easy Really fast Joe Einertson Node.js
  • 8. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way Benefits of Node Some benefits are specific to Node: Underlying engine is fast, mature and well-maintained Same language on server and client (!) Joe Einertson Node.js
  • 9. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Background The Old Way The New Way CPU-intensive = I/O So, how do we handle CPU-intensive work? Turn it into I/O! Spin off new process Yield control Resume when computation finished Result is asynchronous and efficient Joe Einertson Node.js
  • 10. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes CoffeeScript 2 CoffeeScript What is CoffeeScript? CoffeeScript in 10 Minutes Joe Einertson Node.js
  • 11. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes What is CoffeeScript? First released in 2009 Syntax inspired by Python Transcompiles to easily readable JavaScript Seeing wider adoption with popularity of Node.js Joe Einertson Node.js
  • 12. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes CoffeeScript Basics Example # Variables aren’t typed or declared x = 2 + 2 # Everything is an expression height = if isMobile then 300 else 800 # As in JS, easily declare arrays and objects arr = [1, 2, 3] obj = {year: 2004, model: "Camry"} Joe Einertson Node.js
  • 13. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes CoffeeScript Functions Example # Functions are declared with () -> # Last value implicitly returned square = (x) -> x * x # Indentation is used instead of braces area = (r) -> if r <= 0 0 else pi = 3.14 pi * r * r Joe Einertson Node.js
  • 14. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes More CoffeeScript Example # Parentheses are optional in function calls Math.pow(2, n) == Math.pow 2, n # Useful for functional-style invocations squares = util.map [1, 2, 3], (x) -> x * x # String interpolation is awesome... console.log "#{x} + #{y} = #{x+y}" # ...especially when compared to vanilla JS strings console.log "" + x + " + " + y + " = " + (x + y) Joe Einertson Node.js
  • 15. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes Destructuring Assignment...? Example # Quickly assign multiple values [quotient, remainder] = divide 7, 3 # Take apart and put together objects easily {age, name} = dbResult x = 3 point = {x, y: 4} Joe Einertson Node.js
  • 16. What is Node? CoffeeScript Node Basics Node in Practice Conclusion What is CoffeeScript? CoffeeScript in 10 Minutes Classes! CoffeeScript has classes! Example class Point # Automatically assign params to instance fields constructor: (@x, @y) -> @sum = x + y difference: -> @x - @y p = new Point(4, 5) x.difference() # -1 Joe Einertson Node.js
  • 17. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Node Basics 3 Node Basics Hello World Basic Web Server Show me the I/O Joe Einertson Node.js
  • 18. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Hello World Example net = require ’net’ net.createServer (stream) -> stream.write ’Hello World!rn’ stream.pipe stream .listen(8000) Joe Einertson Node.js
  • 19. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Hello World Example http = require ’http’ http.createServer (request, response) -> # 200 = HTTP ’everything OK’ status response.writeHead 200, {’Content-Type’: ’text/plain’} response.end ’Hello World!’ .listen(8000) Response time: <1 ms Apache response time: 100 ms Joe Einertson Node.js
  • 20. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Hello World Basic Web Server Show me the I/O Asynchronous I/O Example http = require ’http’ db = require ’./server/db.coffee’ http.createServer (request, response) -> query = ’SELECT * FROM STOCK;’ db.request query, (err, stock) -> return sendError response, 500 if err response.writeHead 200, { ... } response.end stock.toString() .listen(8000) Joe Einertson Node.js
  • 21. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Node in Practice 4 Node in Practice Libraries express Socket.IO Backbone swig Joe Einertson Node.js
  • 22. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Libraries Web server framework: express Async control flow: async Client-server sync + MVC: Backbone ”Push” framework: Socket.IO Client library: jQuery/Prototype Templates: swig/Mustache/Hogan Utilities: Underscore Libraries and dependencies handled with Node Package Manager (npm) Joe Einertson Node.js
  • 23. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig express express is a widely used wrapper over the built-in Node HTTP library. Example express = require ’express’ app = express() app.get ’/news/:slug’, (req, res) -> res.send "You want the news about #{req.slug}!" app.get ’/*’, (req, res) -> res.sendfile ’index.html’ app.listen(8000) Joe Einertson Node.js
  • 24. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Socket.IO Socket.IO provides a ”push” framework - essentially, a pipe between server and client. Example (Server) socketIO = require ’socket.io’ io = socketIO.listen(app) io.on ’connection’, (socket) -> ClientManager.add socket socket.on ’getData’, (username) -> socket.emit ’data’, cache.findPerson(username) Joe Einertson Node.js
  • 25. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Socket.IO Example (Client) socket = io.connect ’http://localhost’ socket.emit ’getData’, auth.getUsername() socket.on ’data’, (personData) -> ... Joe Einertson Node.js
  • 26. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Backbone provides the client a MVC model as well as automatic client-server syncing. Example (Models) class Message extends Backbone.Model initialize: -> @on ’change:message’, ’addEditMsg’ addEditMsg: -> newMsg = "#{ @get ’message’ } (Edited)" # Use silent: true to prevent infinite loop @set {message: newMsg}, {silent: true} Joe Einertson Node.js
  • 27. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Example (Views) class MessageView extends Backbone.View tagName: ’div’ className: ’message’ template: ’message’ events: ’click .name’: ’showMsgAuthor’ initialize: -> @listenTo @model, ’change’, @render Joe Einertson Node.js
  • 28. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Example (Views) class MessageView extends Backbone.View # Even complex rendering is easy with Backbone render: -> data = time: @get(’time’).toLocaleString() color: if @get(‘byAdmin’) ’red’ else ’white’ super(data) Joe Einertson Node.js
  • 29. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Backbone Example (All Together Now) # Make a model... model = new Message(data) # ...make a view for that model... view = new MessageView({ model }) # ...and insert it into the document $(’.messages’).append view.render().el Joe Einertson Node.js
  • 30. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Libraries express Socket.IO Backbone swig Templates with Swig Building views with templates is easy. Example (message.html) From: {{ name }}<br /> Date: {{ time }}<br /> {{ message }} Example (Client or Server) msgTemplate = swig.compile rawTemplate msg = msgTemplate(msgData) $(’body’).append msg # Client only Joe Einertson Node.js
  • 31. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Conclusion 5 Conclusion Webapp Demo Tying It All Together More Resources Questions Joe Einertson Node.js
  • 32. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions App Demo Simple webchat app Multi-user chat Changes propagate between server and all clients Very little implementation logic 99% business logic Joe Einertson Node.js
  • 33. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions How Big? Server: 200 lines Client: 100 lines HTML: 40 lines CSS: 30 lines Joe Einertson Node.js
  • 34. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Why Node? Runs fast Codes fast Scales Cross-platform Huge library ecosystem Joe Einertson Node.js
  • 35. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Why CoffeeScript? Compatible with JS Cleans up JS syntax About 30% shorter than equivalent JS code Joe Einertson Node.js
  • 36. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions More Resources Node’s own ”why?”: http://nodejs.org/about The C10K problem: http://www.kegel.com/c10k.html My app’s code: https://github.com/royaldark/node-chat-demo Everything Node, by popularity: http://www.nodecloud.org Joe Einertson Node.js
  • 37. What is Node? CoffeeScript Node Basics Node in Practice Conclusion Webapp Demo Tying It All Together More Resources Questions Questions Any questions? Joe Einertson Node.js