Building servers with Node.js
Upcoming SlideShare
Loading in...5
×
 

Building servers with Node.js

on

  • 9,109 views

 

Statistics

Views

Total Views
9,109
Views on SlideShare
9,072
Embed Views
37

Actions

Likes
14
Downloads
239
Comments
0

1 Embed 37

http://rg443blog.wordpress.com 37

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Building servers with Node.js Building servers with Node.js Presentation Transcript

    • Building Servers with Node.js Travis Swicegood #nodetalk Licensed under Creative Commons, Attribution, Share-Alike
    • Hi, I’m Travisbuilding servers with node.js some rights reserved
    • #nodetalkbuilding servers with node.js some rights reserved
    • What’s this talk about?building servers with node.js some rights reserved
    • What is Node.js?building servers with node.js some rights reserved
    • Serversbuilding servers with node.js some rights reserved
    • GTDbuilding servers with node.js some rights reserved
    • Is it Right For Me?building servers with node.js some rights reserved
    • What is Node.js?building servers with node.js some rights reserved
    • Evented I/O Networking Toolkitbuilding servers with node.js some rights reserved
    • What’s “evented?”building servers with node.js some rights reserved
    • Some Codebuilding servers with node.js some rights reserved
    • Standard Data Store var db = new Database({host: "localhost"}); db.connect(); var result = db.find({name: "a-post"}); // do something with resultbuilding servers with node.js some rights reserved
    • Evented Data Store var db = new Database({host: "localhost"}); db.connect(function(conn) { conn.find({name: "a-post"}, function(result) { // do something with result }); });building servers with node.js some rights reserved
    • Event Loopbuilding servers with node.js some rights reserved
    • An Analogybuilding servers with node.js some rights reserved
    • A rabbi, a priest, and a cowboy walk into a bar.building servers with node.js some rights reserved
    • Take 1 Simple Bartenderbuilding servers with node.js some rights reserved
    • Rabbibuilding servers with node.js some rights reserved
    • Priestbuilding servers with node.js some rights reserved
    • Cowboy…building servers with node.js some rights reserved
    • … he starts to talkbuilding servers with node.js some rights reserved
    • Bartender is now blockedbuilding servers with node.js some rights reserved
    • Take 2 Evented Bartenderbuilding servers with node.js some rights reserved
    • Rabbibuilding servers with node.js some rights reserved
    • Priestbuilding servers with node.js some rights reserved
    • Cowboy…building servers with node.js some rights reserved
    • … he starts to talkbuilding servers with node.js some rights reserved
    • Bartender starts filling ordersbuilding servers with node.js some rights reserved
    • Fixing Take 1building servers with node.js some rights reserved
    • Add more bartendersbuilding servers with node.js some rights reserved
    • Limit time with each clientbuilding servers with node.js some rights reserved
    • Respond to Eventsbuilding servers with node.js some rights reserved
    • Who uses this?building servers with node.js some rights reserved
    • Nginxbuilding servers with node.js some rights reserved
    • Memcachedbuilding servers with node.js some rights reserved
    • Most NoSQLbuilding servers with node.js some rights reserved
    • Serversbuilding servers with node.js some rights reserved
    • Basic Socket Serverbuilding servers with node.js some rights reserved
    • Echo Server var net = require("net"); net.createServer(function(socket) { socket.on("data", function(data) { socket.write("You said: " + data); socket.end(); }); socket.write("Please say something:n"); }).listen(1234); console.log("Listening on 1234");building servers with node.js some rights reserved
    • Echo Server var net = require("net"); net.createServer(function(socket) { socket.on("data", function(data) { socket.write("You said: " + data); socket.end(); }); socket.write("Please say something:n"); }).listen(1234); console.log("Listening on 1234");building servers with node.js some rights reserved
    • Echo Server var net = require("net"); net.createServer(function(socket) { socket.on("data", function(data) { socket.write("You said: " + data); socket.end(); }); socket.write("Please say something:n"); }).listen(1234); console.log("Listening on 1234");building servers with node.js some rights reserved
    • Echo Server var net = require("net"); net.createServer(function(socket) { socket.on("data", function(data) { socket.write("You said: " + data); socket.end(); }); socket.write("Please say something:n"); }).listen(1234); console.log("Listening on 1234");building servers with node.js some rights reserved
    • Echo Server var net = require("net"); net.createServer(function(socket) { socket.on("data", function(data) { socket.write("You said: " + data); socket.end(); }); socket.write("Please say something:n"); }).listen(1234); console.log("Listening on 1234");building servers with node.js some rights reserved
    • Echo Server var net = require("net"); net.createServer(function(socket) { socket.on("data", function(data) { socket.write("You said: " + data); socket.end(); }); socket.write("Please say something:n"); }).listen(1234); console.log("Listening on 1234");building servers with node.js some rights reserved
    • Echo Server var net = require("net"); net.createServer(function(socket) { socket.on("data", function(data) { socket.write("You said: " + data); socket.end(); }); socket.write("Please say something:n"); }).listen(1234); console.log("Listening on 1234");building servers with node.js some rights reserved
    • Storing Statebuilding servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Personalized Echo Server net.createServer(function(socket) { var name = false; socket.on("data", function(data) { if (!name) { name = data.toString(utf8).trim(); socket.write("Thanks, " + name + "n"); socket.write("Please say something:n"); } else { socket.write(name + ", you said: " + data); socket.end(); } }); socket.write("Please tell me your name: "); }).listen(1234);building servers with node.js some rights reserved
    • Web Serversbuilding servers with node.js some rights reserved
    • Hello Worldbuilding servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Something’s Differentbuilding servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Any idea why?building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { setTimeout(function() { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>Hello, World!</h1>"); response.end(); }, 1000); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Hello World var http = require("http"); http.createServer(function(request, response) { db.find({"slug": "a-blog-post"}, function(post) { response.writeHead(200, {"Content-Type": "text/html"}); response.write("<h1>" + post.title + "</h1>"); response.write(post.body); response.end(); }); }).listen(4321); console.log("Now listening on port 4321");building servers with node.js some rights reserved
    • Grokking the Requestbuilding servers with node.js some rights reserved
    • Output the Requestbuilding servers with node.js some rights reserved
    • Output the Request var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write(require("util").inspect(request)); response.end(); }).listen(4321); console.log("Listening on 4321");building servers with node.js some rights reserved
    • Output the Request var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write(require("util").inspect(request)); response.end(); }).listen(4321); console.log("Listening on 4321");building servers with node.js some rights reserved
    • Output the Request $ curl -s http://localhost:4321/ { socket: { bufferSize: 0, fd: 7, type: tcp4, allowHalfOpen: true, _readWatcher: { socket: [Circular], callback: [Function: onReadable] }, readable: true, _writeQueue: [], _writeQueueEncoding: [], _writeQueueFD: [], … and so on, and so on …building servers with node.js some rights reserved
    • Output the Request $ curl -s http://localhost:4321/ … way down around line 148 … url: /, method: GET,building servers with node.js some rights reserved
    • Output the Request $ curl -s http://localhost:4321/say?msg=Hello | grep "url:" url: /say?msg=Hello,building servers with node.js some rights reserved
    • Parsing the URLbuilding servers with node.js some rights reserved
    • Parsing the URL var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); var parsedUrl = require("url").parse(request.url); response.write(require("util").inspect(parsedUrl)); response.end(); }).listen(4321); console.log("Listening on 4321");building servers with node.js some rights reserved
    • Parsing the URL $ curl -s http://localhost:4321/say?msg=Hello { href: /say?msg=Hello, search: ?msg=Hello, query: msg=Hello, pathname: /say }building servers with node.js some rights reserved
    • Parsing the URL $ curl -s http://localhost:4321/say?msg=Hello { href: /say?msg=Hello, search: ?msg=Hello, query: msg=Hello, pathname: /say }building servers with node.js some rights reserved
    • Parsing the URL $ curl -s http://localhost:4321/say?msg=Hello { href: /say?msg=Hello, search: ?msg=Hello, query: msg=Hello, pathname: /say }building servers with node.js some rights reserved
    • Parsing the URL $ curl -s http://localhost:4321/say?msg=Hello { href: /say?msg=Hello, search: ?msg=Hello, query: msg=Hello, pathname: /say }building servers with node.js some rights reserved
    • Parsing the URL $ curl -s http://localhost:4321/say?msg=Hello { href: /say?msg=Hello, search: ?msg=Hello, query: msg=Hello, pathname: /say }building servers with node.js some rights reserved
    • Parsing the Querybuilding servers with node.js some rights reserved
    • Parsing the Query $ curl -s http://localhost:4321/say?msg=Hello { href: /say?msg=Hello, search: ?msg=Hello, query: msg=Hello, pathname: /say }building servers with node.js some rights reserved
    • Parsing the Query var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); var parsedUrl = require("url").parse(request.url, true); response.write(require("util").inspect(parsedUrl)); response.end(); }).listen(4321); console.log("Listening on 4321");building servers with node.js some rights reserved
    • Parsing the Query var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); var parsedUrl = require("url").parse(request.url, true); response.write(require("util").inspect(parsedUrl)); response.end(); }).listen(4321); console.log("Listening on 4321");building servers with node.js some rights reserved
    • Parsing the Query $ curl -s http://localhost:4321/say?msg=Hello { href: /say?msg=Hello, search: ?msg=Hello, query: { msg: Hello }, pathname: /say }building servers with node.js some rights reserved
    • Receiving Databuilding servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Receiving Data function(request, response) { var raw = ""; request.on("data", function(chunk) { raw += chunk; }); request.on("end", function() { var data = JSON.parse(raw), obj = {message: data.message.split("").reverse().join("")}; response.writeHead(200, {"Content-Type": "application/json"}); response.write(JSON.stringify(obj)); response.end(); }); }building servers with node.js some rights reserved
    • Something is Wrongbuilding servers with node.js some rights reserved
    • Can’t handle Errors $ node json-reverse.js Listening on 4321 undefined:0 ^ SyntaxError: Unexpected end of input at Object.parse (native) at IncomingMessage.<anonymous> (/Book/code/servers/json- reverse.js:8:21) at IncomingMessage.emit (events.js:39:17) at HTTPParser.onMessageComplete (http.js:111:23) at Socket.ondata (http.js:945:22) at Socket._onReadable (net.js:654:27) at IOWatcher.onReadable [as callback] (net.js:156:10)building servers with node.js some rights reserved
    • Fault-Tolerancebuilding servers with node.js some rights reserved
    • Quick Refactor var handleResponse = function(response, code, message) { response.writeHead(code, {"Content-Type": "application/json"}); response.write(message); response.end(); };building servers with node.js some rights reserved
    • Fault Tolerant Reverse request.on("end", function() { if (!raw) { handleResponse(response, 400, "Requires more data"); return; } try { var data = JSON.parse(raw); } catch(e) { handleResponse(response, 400, "Invalid JSON"); return; } if (!data.message) { handleResponse(response, 400, "Requires a message"); return; } var obj = {message: data.message.split("").reverse().join("") }; handleResponse(response, 200, JSON.stringify(obj)) });building servers with node.js some rights reserved
    • Fault Tolerant Reverse request.on("end", function() { if (!raw) { handleResponse(response, 400, "Requires more data"); return; } try { var data = JSON.parse(raw); } catch(e) { handleResponse(response, 400, "Invalid JSON"); return; } if (!data.message) { handleResponse(response, 400, "Requires a message");building servers with node.js some rights reserved
    • Fault Tolerant Reverse request.on("end", function() { if (!raw) { handleResponse(response, 400, "Requires more data"); return; } try { var data = JSON.parse(raw); } catch(e) { handleResponse(response, 400, "Invalid JSON"); return; } if (!data.message) { handleResponse(response, 400, "Requires a message");building servers with node.js some rights reserved
    • Fault Tolerant Reverse // earlier code } catch(e) { handleResponse(response, 400, "Invalid JSON"); return; } if (!data.message) { handleResponse(response, 400, "Requires a message"); return; } var obj = {message: data.message.split("").reverse().join("") }; handleResponse(response, 200, JSON.stringify(obj)) });building servers with node.js some rights reserved
    • Fault Tolerant Reverse // earlier code } catch(e) { handleResponse(response, 400, "Invalid JSON"); return; } if (!data.message) { handleResponse(response, 400, "Requires a message"); return; } var obj = {message: data.message.split("").reverse().join("") }; handleResponse(response, 200, JSON.stringify(obj)) });building servers with node.js some rights reserved
    • GTDbuilding servers with node.js some rights reserved
    • Libraries Helpbuilding servers with node.js some rights reserved
    • Express visionmedia/expressbuilding servers with node.js some rights reserved
    • Hello World var app = express.createServer(); app.get(/, function(req, res){ res.send(Hello World); }); app.listen(3000);building servers with node.js some rights reserved
    • Socket.IO http://socket.io/building servers with node.js some rights reserved
    • Push from the Server var http = require(http),       io = require(socket.io); var server = http.createServer(function(req, res){  // your normal server code  res.writeHead(200, {Content-Type: text/html});  res.end(<h1>Hello world</h1>); }); server.listen(80);   // socket.io var socket = io.listen(server); socket.on(connection, function(client){   // new client is here!   client.on(message, function(){ … })   client.on(disconnect, function(){ … }) });building servers with node.js some rights reserved
    • Socket.IO // socket.io var socket = io.listen(server); socket.on(connection, function(client){   // new client is here!   client.on(message, function(){ … })   client.on(disconnect, function(){ … }) });building servers with node.js some rights reserved
    • Sending to Client // socket.io var socket = io.listen(server); socket.on(connection, function(client) { // send a message back to the client client.send({msg: "Thanks for connecting…"}); // broadcast a message to everyone client.broadcast({msg: "Another one connected!"}); });building servers with node.js some rights reserved
    • CoffeeScript jashkenas/coffee-scriptbuilding servers with node.js some rights reserved
    • Remember this code? request.on("end", function() { if (!raw) { handleResponse(response, 400, "Requires more data"); return; } try { var data = JSON.parse(raw); } catch(e) { handleResponse(response, 400, "Invalid JSON"); return; } if (!data.message) { handleResponse(response, 400, "Requires a message"); return; } var obj = {message: data.message.split("").reverse().join("") }; handleResponse(response, 200, JSON.stringify(obj)) });building servers with node.js some rights reserved
    • In CoffeeScript request.on "end", () -> return handleResponse response, 400, "Requires more data" unless raw try data = JSON.parse raw catch e return handleResponse response, 400, "Requires more data" return handleResponse response, 400, "Requires a message" unless data.message obj = message: data.message.split("").reverse().join("") handleResponse response, 200, JSON.stringify objbuilding servers with node.js some rights reserved
    • Vows cloudhead/vows http://vowjs.org/building servers with node.js some rights reserved
    • No Samplesbuilding servers with node.js some rights reserved
    • Is it Right For Me?building servers with node.js some rights reserved
    • It Dependsbuilding servers with node.js some rights reserved
    • The Checklistbuilding servers with node.js some rights reserved
    • Control the Stackbuilding servers with node.js some rights reserved
    • Comfortable with Changebuilding servers with node.js some rights reserved
    • Full Control Over App Logicbuilding servers with node.js some rights reserved
    • Lots of Small Independent Piecesbuilding servers with node.js some rights reserved
    • Then Maybebuilding servers with node.js some rights reserved
    • Where to?building servers with node.js some rights reserved
    • nodejs.orgbuilding servers with node.js some rights reserved
    • #Node.js (freenode)building servers with node.js some rights reserved
    • Travis Swicegood travisswicegood.com @tswicegood travis@domain51.com http://joind.in/2810building servers with node.js some rights reserved