1

I'm trying to figure out a few simple best practices when it comes to structuring a nodeJS server object. Please note that I'm coming from a LAMP background, so the whole thing is somewhat of a paradigm shift for me.


Static Content

Static content has documented examples, and works like a charm:

var http = require('http'), 
    url = require('url'),
    fs = require('fs'),
    sys = require(process.binding('natives').util ? 'util' : 'sys');

server = http.createServer(function(req, res){
    var parsedURL = url.parse(req.url, true);
    var path = parsedURL.pathname;
    var query = parsedURL.query;

    switch (path){
        case '/':
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.write('<h1>Greetings!</h1>');
            res.end();
            break;

        default:
            fs.readFile(__dirname + path, function(err, data){
            if (err) return send404(res);
                res.writeHead(200, {'Content-Type':'text/html'})
                res.write(data, 'utf8');
                res.end();
            });
    }
}).listen(80);

send404 = function(res){
    res.writeHead(404);
    res.write('404');
    res.end();
};

The server listens for requests, looks up the files, and shoots the content of those files back to the client. Obviously the example I gave is quite dumb and doesn't account for files that aren't text/html, but you get the idea.


Dynamic Content

But what if we don't want to serve static content? What if we want to, for instance, have a hello world file which takes in a value from the querystring and responds differently.

My first guess is that I should create a second file using the nodeJS module setup, give it some module methods which take in information, and just concatenate a crap load of strings together.

For instance, a hello world module called hello.js:

exports.helloResponse = function( userName ) {
  var h = "<html>";
  h += "<head><title>Hello</title></head>";
  h += "<body>Hello, " + userName +"</body>";
  h += "</html>";
}

and then add the following case to the server handler:

case 'hello':
  res.writeHead(200, {'Content-Type':'text/html'})
  res.write(require("./hello.js").helloResponse(query["userName"]), 'utf8');
  res.end();

I'm OK with the module, but I hate the fact that I have to create a giant concatenated string in javascript. Does the S.O. community have any ideas? What approaches have you taken to this situation?

generalhenry
  • 17,227
  • 4
  • 48
  • 63
slifty
  • 13,062
  • 13
  • 71
  • 109
  • The big string can be replaced by a template, [here are some of your options](http://stackoverflow.com/questions/1787716/is-there-a-template-engine-for-node-js) – Tobu Feb 19 '11 at 22:37

2 Answers2

5

Node.js is a "bare bones" platform (not unlike Python or Ruby), which makes it very flexible.

You will benefit from using Node.js with a web framework such as Express.js to handle the grunt work. Express.js uses another module, Connect.js, to provide routing, configuration, templating, static file serving, and more.

You will also want a template language. EJS, for example, gives you a PHP/JSP-style templating language, while Jade provides a Haml-esque approach.

Explore the list of frameworks and templating engines on the Node.js modules page and see which you prefer.

Bas Dirks
  • 411
  • 3
  • 7
Marcello Bastea-Forte
  • 1,167
  • 1
  • 10
  • 7
0

Node.js is not bare bones any more. Use a framework of you choice. Take a look at least at express and socketstream frameworks. Also take a look at socket.io as a replacement for AJAX.

nponeccop
  • 13,527
  • 1
  • 44
  • 106