To celebrate my move to the Agile Consulting and Training division of Xebia I thought it would be very appropriate to start playing with some hip new technologies.

From their homepages:

Node.js: Evented I/O for V8 JavaScript. (A framework for building completely non-blocking servers in Javascript)
NPM: A package manager for node.
CoffeeScript: A little language that compiles into JavaScript
Express: High performance, high class web development for Node.js
Jade: Node Template Engine
Redis: An open source, advanced key-value store

In this guide I will take very small steps so that you can verify that you are check whether you are still on track.
The result is an extremely performant, scalable and lightweight alternative for web development.

So I installed a brand new Ubuntu 11.4 virtual machine and got started. After following some tutorials, googling and some tweaking this is the step-by-step guide I came up with.

Installing Node.js

Installing npm

Node.js Hello World

insert

[javascript]
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(1337);
console.log(‘Server running at http://127.0.0.1:1337/’);
[/javascript]

check http://127.0.0.1:1337

Add Coffeescript

Writing all that javascript is going to lead to lots and lots of brackets, semi-colons and parantheses. Let’s use Coffeescript to make our code readable again.

insert

[javascript]http = require "http"
http.createServer( (req, res) ->
res.writeHead 200, {"Content-Type": "text/plain"}
res.end "Hello Coffee!!"
).listen 1337

console.log ‘Server running at http://127.0.0.1:1337/’
[/javascript]

And check http://127.0.0.1:1337 again.

Adding Express

Node.js is a very powerful, but it still requires quite a bit of boilerplating to use it for web development. That’s where Express comes in. It is build on top of another middleware layer called Connect and gives you much better support in handling requests, rendering, templates and responses.

check http://127.0.0.1:3000

insert:

[javascript]
express = require(‘express’)app = express.createServer()

# Setup configuration
app.use express.static(__dirname + ‘/public’)
app.set ‘view engine’, ‘jade’

# App Routes
app.get ‘/’, (request, response) ->
response.render ‘index’, { title: ‘Express with Coffee’ }

# Listen
app.listen 3000
console.log "Express server listening on port %d", app.address().port
[/javascript]

And check http://127.0.0.1:3000 again.
Now that we have Coffeescript working with Express let’s add sessions.

Add session support

insert after app.use express.static(__dirname + ‘/public’)

[javascript]app.use express.cookieParser()
app.use express.session {secret: "Coffeebreak" }
[/javascript]

insert after app.get ‘/’, (request, response) ->

[javascript]request.session.views++[/javascript]

replace

[javascript]response.render ‘index’, { title: request.session.views + ‘: Express with Coffee and sessions’ }[/javascript]

Check http://127.0.0.1:3000 and refresh a few times. You should see the counter increase.

Install Redis

Open a new terminal.

Add redis session to node

insert after express = require ‘express’

[javascript]RedisStore = require(‘connect-redis’)(express)[/javascript]

change

[javascript]app.use express.session {secret: "Coffeebreak", store: new RedisStore, cookie: { maxAge: 60000 } }[/javascript]

In the Redis terminal you should now see something like:

Check http://127.0.0.1:3000 and refresh a bunch of times
kill and restart node

Check http://127.0.0.1:3000 again and refresh a few more times
Note that you started where you left off.

And that brings us to the end of this guide. As you can see the stack is very powerful and extremely small, lightweight and clean. With all the session information in the Redis store the availability of the entire systems comes down to the availability of Redis. And with these guys working on a proper clustering solution it will be very interesting to see where all this is going in the near future.