KEMBAR78
Building servers with Node.js
Building Servers
  with Node.js
         Travis Swicegood

       #nodetalk
   Licensed under Creative Commons,
        Attribution, Share-Alike
Hi, I’m Travis
building servers with node.js   some rights reserved
#nodetalk
building 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
Servers
building servers with node.js   some rights reserved
GTD
building 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
                     Toolkit
building servers with node.js   some rights reserved
What’s “evented?”
building servers with node.js   some rights reserved
Some Code
building 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 result




building 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 Loop
building servers with node.js       some rights reserved
An Analogy
building 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 Bartender
building servers with node.js   some rights reserved
Rabbi
building servers with node.js           some rights reserved
Priest
building servers with node.js            some rights reserved
Cowboy…
building servers with node.js     some rights reserved
… he starts
                     to talk
building servers with node.js   some rights reserved
Bartender is
                 now blocked
building servers with node.js   some rights reserved
Take 2
  Evented Bartender
building servers with node.js   some rights reserved
Rabbi
building servers with node.js           some rights reserved
Priest
building servers with node.js            some rights reserved
Cowboy…
building servers with node.js     some rights reserved
… he starts
                     to talk
building servers with node.js   some rights reserved
Bartender starts
        filling orders
building servers with node.js   some rights reserved
Fixing Take 1
building servers with node.js   some rights reserved
Add more
                    bartenders
building servers with node.js   some rights reserved
Limit time
        with each client
building servers with node.js   some rights reserved
Respond to
                      Events
building servers with node.js   some rights reserved
Who uses this?
building servers with node.js   some rights reserved
Nginx
building servers with node.js           some rights reserved
Memcached
building servers with node.js   some rights reserved
Most NoSQL
building servers with node.js   some rights reserved
Servers
building servers with node.js   some rights reserved
Basic Socket Server
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
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 State
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
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 Servers
building servers with node.js   some rights reserved
Hello World
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
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
                     Different
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
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 Request
building servers with node.js   some rights reserved
Output the Request
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
     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 URL
building 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 Query
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
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 Data
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
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 Wrong
building 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-Tolerance
building 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
GTD
building servers with node.js         some rights reserved
Libraries Help
building servers with node.js   some rights reserved
Express
                     visionmedia/express

building 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-script

building 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 obj




building servers with node.js                                               some rights reserved
Vows
                         cloudhead/vows
                        http://vowjs.org/
building servers with node.js               some rights reserved
No Samples
building servers with node.js     some rights reserved
Is it Right
           For Me?
building servers with node.js   some rights reserved
It Depends
building servers with node.js       some rights reserved
The Checklist
building servers with node.js   some rights reserved
Control
                          the Stack
building servers with node.js         some rights reserved
Comfortable
                    with Change
building servers with node.js   some rights reserved
Full Control Over
              App Logic
building servers with node.js   some rights reserved
Lots of Small
                   Independent
                      Pieces
building servers with node.js   some rights reserved
Then Maybe
building servers with node.js   some rights reserved
Where to?
building servers with node.js     some rights reserved
nodejs.org
building 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/2810
building servers with node.js                 some rights reserved

Building servers with Node.js

  • 1.
    Building Servers with Node.js Travis Swicegood #nodetalk Licensed under Creative Commons, Attribution, Share-Alike
  • 2.
    Hi, I’m Travis buildingservers with node.js some rights reserved
  • 3.
    #nodetalk building servers withnode.js some rights reserved
  • 4.
    What’s this talk about? building servers with node.js some rights reserved
  • 5.
    What is Node.js? building servers with node.js some rights reserved
  • 6.
    Servers building servers withnode.js some rights reserved
  • 7.
    GTD building servers withnode.js some rights reserved
  • 8.
    Is it Right For Me? building servers with node.js some rights reserved
  • 9.
    What is Node.js? building servers with node.js some rights reserved
  • 10.
    Evented I/O Networking Toolkit building servers with node.js some rights reserved
  • 11.
    What’s “evented?” building serverswith node.js some rights reserved
  • 12.
    Some Code building serverswith node.js some rights reserved
  • 13.
    Standard Data Store var db = new Database({host: "localhost"}); db.connect(); var result = db.find({name: "a-post"}); // do something with result building servers with node.js some rights reserved
  • 14.
    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
  • 15.
    Event Loop building serverswith node.js some rights reserved
  • 16.
    An Analogy building serverswith node.js some rights reserved
  • 17.
    A rabbi, apriest, and a cowboy walk into a bar. building servers with node.js some rights reserved
  • 18.
    Take 1 Simple Bartender building servers with node.js some rights reserved
  • 19.
    Rabbi building servers withnode.js some rights reserved
  • 20.
    Priest building servers withnode.js some rights reserved
  • 21.
    Cowboy… building servers withnode.js some rights reserved
  • 22.
    … he starts to talk building servers with node.js some rights reserved
  • 23.
    Bartender is now blocked building servers with node.js some rights reserved
  • 24.
    Take 2 Evented Bartender building servers with node.js some rights reserved
  • 25.
    Rabbi building servers withnode.js some rights reserved
  • 26.
    Priest building servers withnode.js some rights reserved
  • 27.
    Cowboy… building servers withnode.js some rights reserved
  • 28.
    … he starts to talk building servers with node.js some rights reserved
  • 29.
    Bartender starts filling orders building servers with node.js some rights reserved
  • 30.
    Fixing Take 1 buildingservers with node.js some rights reserved
  • 31.
    Add more bartenders building servers with node.js some rights reserved
  • 32.
    Limit time with each client building servers with node.js some rights reserved
  • 33.
    Respond to Events building servers with node.js some rights reserved
  • 34.
    Who uses this? buildingservers with node.js some rights reserved
  • 35.
    Nginx building servers withnode.js some rights reserved
  • 36.
    Memcached building servers withnode.js some rights reserved
  • 37.
    Most NoSQL building serverswith node.js some rights reserved
  • 38.
    Servers building servers withnode.js some rights reserved
  • 39.
    Basic Socket Server buildingservers with node.js some rights reserved
  • 40.
    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
  • 41.
    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
  • 42.
    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
  • 43.
    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
  • 44.
    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
  • 45.
    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
  • 46.
    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
  • 47.
    Storing State building serverswith node.js some rights reserved
  • 48.
    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
  • 49.
    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
  • 50.
    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
  • 51.
    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
  • 52.
    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
  • 53.
    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
  • 54.
    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
  • 55.
    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
  • 56.
    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
  • 57.
    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
  • 58.
    Web Servers building serverswith node.js some rights reserved
  • 59.
    Hello World building serverswith node.js some rights reserved
  • 60.
    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
  • 61.
    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
  • 62.
    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
  • 63.
    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
  • 64.
    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
  • 65.
    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
  • 66.
    Something’s Different building servers with node.js some rights reserved
  • 67.
    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
  • 68.
    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
  • 69.
    Any idea why? buildingservers with node.js some rights reserved
  • 70.
    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
  • 71.
    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
  • 72.
    Grokking the Request building servers with node.js some rights reserved
  • 73.
    Output the Request buildingservers with node.js some rights reserved
  • 74.
    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
  • 75.
    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
  • 76.
    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
  • 77.
    Output the Request $ curl -s http://localhost:4321/ … way down around line 148 … url: '/', method: 'GET', building servers with node.js some rights reserved
  • 78.
    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
  • 79.
    Parsing the URL buildingservers with node.js some rights reserved
  • 80.
    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
  • 81.
    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
  • 82.
    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
  • 83.
    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
  • 84.
    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
  • 85.
    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
  • 86.
    Parsing the Query buildingservers with node.js some rights reserved
  • 87.
    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
  • 88.
    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
  • 89.
    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
  • 90.
    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
  • 91.
    Receiving Data building serverswith node.js some rights reserved
  • 92.
    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
  • 93.
    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
  • 94.
    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
  • 95.
    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
  • 96.
    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
  • 97.
    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
  • 98.
    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
  • 99.
    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
  • 100.
    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
  • 101.
    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
  • 102.
    Something is Wrong building servers with node.js some rights reserved
  • 103.
    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
  • 104.
    Fault-Tolerance building servers withnode.js some rights reserved
  • 105.
    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
  • 106.
    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
  • 107.
    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
  • 108.
    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
  • 109.
    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
  • 110.
    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
  • 111.
    GTD building servers withnode.js some rights reserved
  • 112.
    Libraries Help building serverswith node.js some rights reserved
  • 113.
    Express visionmedia/express building servers with node.js some rights reserved
  • 114.
    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
  • 115.
    Socket.IO http://socket.io/ building servers with node.js some rights reserved
  • 116.
    Push from theServer 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
  • 117.
    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
  • 118.
    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
  • 119.
    CoffeeScript jashkenas/coffee-script building servers with node.js some rights reserved
  • 120.
    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
  • 121.
    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 obj building servers with node.js some rights reserved
  • 122.
    Vows cloudhead/vows http://vowjs.org/ building servers with node.js some rights reserved
  • 123.
    No Samples building serverswith node.js some rights reserved
  • 124.
    Is it Right For Me? building servers with node.js some rights reserved
  • 125.
    It Depends building serverswith node.js some rights reserved
  • 126.
    The Checklist building serverswith node.js some rights reserved
  • 127.
    Control the Stack building servers with node.js some rights reserved
  • 128.
    Comfortable with Change building servers with node.js some rights reserved
  • 129.
    Full Control Over App Logic building servers with node.js some rights reserved
  • 130.
    Lots of Small Independent Pieces building servers with node.js some rights reserved
  • 131.
    Then Maybe building serverswith node.js some rights reserved
  • 132.
    Where to? building serverswith node.js some rights reserved
  • 133.
    nodejs.org building servers withnode.js some rights reserved
  • 134.
    #Node.js (freenode) building servers with node.js some rights reserved
  • 135.
    Travis Swicegood travisswicegood.com @tswicegood travis@domain51.com http://joind.in/2810 building servers with node.js some rights reserved