Friday 12 September 2014

create application using mvc structure in node.js

Standard
i am come back after few days

in this days i have try to create a MVC system in node.js and after few days i have successful

i have use lot's of mvc in node but does not simple so then i have decide to developed new mvc, it simple

MVC is a nice structure in computer science in this structure anybody can create a application using small bit of coding, it's nice and reuse of code

ok what is MVC : it's just a structure
M: model
V: View
C: controller

in M(model) we will connect to database and take or manipulate data with database,
in V(view) it's only for design where programmer can define application presentation how it will look like
in C(controller) it's a heart of application where all process will done, actually C get or set data from M and M take/give data from/to database and send to C as C's requirement and C create a data structure and send it to V and V will just show it, and this is story

ok now i will define how you will follow my mvc structure

just go to your application folder from terminal and type bellow command

$ sudo npm install just-mvc



after complete installation next create folder structure like:


create folder like screen shot and follow bellow detail
 and also you can see my dusybin link where you will get example and structure

http://netai-nayek.blogspot.in/p/sandbox.html

or follow for example

https://github.com/netai/todo-list

App structure

/
    models/                     -- all of your models here
    controllers/                -- all of your controllers here
    views/
    config/
        express.js              -- your express config
        orm.js                  -- your orm config
        routes.js               -- router
        settings.js             -- app settings (ip, port, database, ...)
    app.js                      -- root
Please check example

How to use

Please check example or follow these document
Example: https://github.com/netai/todo-list

Init

require(just-mvc)(function(err){
    if(err) {
        console.log(err);
        return;
    }
    console.log('done');
});

Models

A model file should be like this
module.exports = function (orm, db) {
    //define your orm model here
}; 
 
Example:
models/post.js
module.exports = function (orm, db) {
    var Post = db.define('post', {
        title:      { type: 'text' },
        content:    { type: 'text' }
    });
}; 
 
Check ORM document Defining Models

Controllers

A controller file should be like this
module.exports = {
    //define your controller here
}; 
 
Example:
controllers/post.js
module.exports = {
    home: function(req, res, next){
        res.send('home page');
    },
    get: function(req, res, next) {
        req.models.post.find(function(err, data) {
            res.send(data);
        });
    },
    create: function(req, res, next) {
        req.models.post.create({
            title: 'title',
            content: 'content'
        }, function(err, result) {
            res.send(result);
        });
    }
}; 
 
Note: you can list all of your models in req.models, check more here

Settings

config/settings.js
 
A settings file should be like this

module.exports = {
    mode1: { //development
        ip: <ip>,
        port: <port>,
        db: // orm database setting object
    },
    mode2: { //production
        ip: <ip>,
        port: <port>,
        db: // orm database setting object
    }
}; 
 
Example:
module.exports = {
    development: {
        ip: '127.0.0.1',
        port: 8080,
        db: {
            host: '127.0.0.1',
            port: 3306,
            protocol: 'mysql',
            user: 'root',
            password: '123456789',
            database: 'just-mvc-test',
            connectionLimit: 100
        }
    },
    production: {
        ip: '127.0.0.1',
        port: 8080,
        db: {
            host: '127.0.0.1',
            port: 3306,
            protocol: 'mysql',
            user: 'root',
            password: '123456789',
            database: 'just-mvc-test',
            connectionLimit: 100
        }
    }
}; 
 
Note: You should set your NODE_ENV variable (development or production), or you can by pass by send directly the mode option when init, check here
Check ORM document Connecting to Database

Express config

config/express.js
 
A express config file should be like this
module.exports = function(app, express) {
    //any express config here
}; 
 
Example:
module.exports = function(app, express) {
    app.set('title', 'testing');
    app.set('views', '../views');
    app.set('view engine', 'ejs');
    app.use(express.favicon());
}; 
 
Check Express document api
Note:
  • As you see there is no views folder in app structure, so create and manage by yourself
  • Library will start a server automatically, so no need this kind of this stuff
http.createServer(app).listen(function(){});

ORM config

config/orm.js
A orm config file should be like this
module.exports = function(orm, db) {
    //any orm config here
};
Example:
module.exports = function(orm, db) {
    db.settings.set('test', 'testing data');
};
Check ORM document Settings
Note: Library will sync database automatically.

Routes config

config/routes.js
A routes config file should be like this
module.exports = function(app, controllers) {
    //routes here
};
Example:
module.exports = function(app, controllers) {
    app.get(    '/'       , controllers.post.home);
    app.get(    '/post'   , controllers.post.get);
    app.post(   '/post'   , controllers.post.create);
};

Options

require(just-mvc)({
    mode: 'development',           //default: production
    path: __dirname,               //default: auto detect
    express: require('express'),   //specify your express version
    orm: require('orm')            //specify your orm version
}, callback);
Example:
var express = require('express')    // Express 4
var orm = require('orm')            // ORM 2.1.0

require(just-mvc)({
    mode: 'development',
    path: '/Code/Project',
    express: express,
    orm: orm
}, callback);

Return object

express
orm
server web server instance
database orm database instance
app express app instance
settings the current settings
mode the current mode
require(just-mvc)(functiom(err, mvc) {
    mvc.express;
    mvc.orm;
    mvc.server;
    mvc.database;
    mvc.app;
    mvc.settings;
    mvc.mode;
});

Notes

For your convenience, you can get
  • models: all the orm models
  • settings: the running setings
  • mode: the running mode

from express req

function (req, res, next) {
    req.models;
    req.settings;
    req.mode;
}

from express config file

//config/express.js
module.exports = function(app, express, mvc) {
    mvc.mode
    mvc.settings
};

from orm config file

//config/orm.js
module.exports = function(orm, db, mvc) {
    mvc.mode
    mvc.settings
};


i think you will enjoy just test it and if you want any help you can comment me here