2. “Node's goal is to provide an easy way to build
scalable network programs.”
3. What is node?
• Command line tool to run JavaScript:
$ node my_app.js
• Built on top of Google's V8 JavaScript engine
• Provides a JavaScript API for network and file system
• Event-based, non-blocking I/O APIs
5. The cost of I/O?
• Accessing RAM ~ 250 CPU cycles
• Disk operations ~ 41 000 000 CPU cycles
o Reading a file
o Writing to a file
• Network I/O ~ 240 000 000 CPU cycles
o Database query responses
o Http responses
o Memcache results
6. • I/O is expensive
• Most web applications are I/O bound, not CPU bound
7. Handling I/O
• Apache is multithreaded (depending on conf.)
o Spawns a thread per request (or process)
• Each request is in its own "box", blocking I/O is "okay".
result = query('SELECT * FROM ...');
print result.id;
10. Enter node...
• Single thread for your code
• ...but, I/O runs in parallel
• Handle thousands of concurrent connections with a single
process
• Need to be very careful with CPU-intensive code
11. I/O in node
• No function should directly perform I/O.
• To receive info from disk, network, or another process there
must be a callback.
• Callbacks are typically in the format:
function (err, result) { }
query('SELECT * FROM ...', function (err, result){
if (!err) {
print result.id;
}
});
13. Built-in Modules
• File System
require('fs');
• HTTP Client and Server
require('http');
• TCP Sockets
require('net');
• Many more: http://nodejs.org/docs/v0.4.8/api/
14. Getting Started
• Node.js: http://nodejs.org/#download
• Build instructions: http://bit.ly/egLfzu
Mac: brew update && brew install node
• npm, a package manager for Node:
curl http://npmjs.org/install.sh | sh
• Many modules at: http://search.npmjs.org/
• Windows support isn't great (for the moment)
15. Reading a JSON File
var fs = require('fs');
var file = __dirname + '/test.json';
fs.readFile(file, 'utf8', function (err, data) {
if (err) {
console.log('Error: ' + err);
return;
}
data = JSON.parse(data);
console.dir(data);
});
https://gist.github.com/988107
16. Simple HTTP Server
var http = require('http');
var s = http.createServer(function (req, res) {
var headers = {'Content-Type': 'text/html'};
req.writeHead(200, headers);
res.end('<h1>hello world</h1>');
});
s.listen(8080, '127.0.0.1');
https://gist.github.com/988108
17. Express makes HTTP easier
• Node's HTTP module is low level.
• Express is a simple framework inspired by Sinatra (Ruby).
• Installing Express:
npm install express && npm install jade
• Robust verb-based routing
o app.get('/about', function(req, res) { });
o app.post('/login', function(req, res) { });
• Templating (with Jade or EJS)
• Sessions
18. Getting Started with Express
• Generate skeleton apps:
express –help
• Generate app with sessions and template engine:
express --sessions --template jade hello/
• Generated structure:
$ ls hello/
app.js logs pids public test views
$ ls hello/views/
index.jade layout.jade