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?

1

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

Comments

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.