Monday, April 23, 2012

How would MVC-like code work in Node.js?


I'm starting to get my head around node.js, and I'm trying to figure out how I would do normal MVC stuff. For example, here's a Django view that pulls two sets of records from the database, and sends them to be rendered in a template.




def view(request):
things1 = ThingsOne.objects.all()
things2 = ThingsTwo.objects.all()
render_to_response('template.html, {'things1': things1, 'things2': things2})



What might a similar node.js function look like?


Source: Tips4all

5 comments:

  1. http://boldr.net/mvc-stack-node-js-ejsgi-scylla-mustache is a great little article with a full github example of a MVC pattern using dirfferent Node modules. It also lists alternate modules currently available. It answered this question for me better than http://howtonode.org/ which has some good tuts but I couldn't find anything on MVC there.

    ReplyDelete
  2. I've found http://howtonode.org/ to be a big help in getting me up-to-speed.

    ReplyDelete
  3. That might be:

    var view = function(request) {
    var things1 = Things.objects.all();
    var things2 = Things.objects.all();
    render_to_response('template.html', { things1: things1, things2: things2 });
    };


    Or if you have asynchronous API:

    var view = function(request) {
    var model = {};
    Things.objects.getAll(function(things1) {
    model.things1 = things1;
    if(model.things2) {
    render_to_response('template.html', model);
    }
    });
    Things.objects.getAll(function(things2) {
    model.things2 = things2;
    if(model.things1) {
    render_to_response('template.html', model);
    }
    });
    };

    ReplyDelete
  4. The easiest way to do this is with expressjs, which is an MVC framework for Node. Node is just what it says, evented I/O for the web.

    The example on the http://expressjs.com should help with the basics but to answer your question directly.

    var express = require('express');

    var app = express.createServer();

    app.get('/whatever', function(req, res) {

    Things1.objects.getAll(function(things1) {
    Things2.objects.getAll(function(things2) {
    var options = { locals: { things1: things1, things2: things2 }};
    res.render('thingstemplate.ejs', options); // or thingstemplate.jade or whatever
    });
    });
    });

    app.listen('80', ''); // port and optional hostname to bind

    ReplyDelete