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