Friday 26 September 2014

x-mvc a mvc package for node.js

Standard

x-mvc

today i will give a small description on a recent cooked mvc package this is developed for node.js and also this is so easy just download and use it and also it development on going for more better test you can check this in -

https://www.npmjs.org/package/x-mvc
https://github.com/netai/x-mvc

(if you have any idea or suggestion please write in comment it is very great full for me)

this is a simple node.js mvc structure this is a extended version of just-mvc it is more better of just-mvc. in this mvc we have added more feture like:
  • create slug
  • flush message
  • more comfortable structure
 
this mvc have some separet part like
  • Database(default mysql)
  • App structure
  • Router
  • Separate modules
  • ...
So hope this library help someone like me.
Any ideas are appreciated.

Features

  • MVC
  • This library just help you to structure your code
  • No Express or ORM hack
  • Config Express and ORM by yourself (Fully control)

Dependencies

By default:
You can specify those dependencies version by option, please refer to this

Installation

npm install x-mvc --save
Database package
for mysql no need to proccess bellow step (default database mysql)

npm install <your database package>

//example
npm install mysql
Refer to ORM document Connecting to Database

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

Init

require(x-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: '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: '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('view engine', 'ejs');
};
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/dbConfig.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(x-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:
require(x-mvc)({
    mode: 'development',
    path: '/Code/Project',
}, 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
};

New Feature

Flush Message
for flush message follow bellow step
when you redirect or show view then first save this two data in session

req.session.msg="message";
req.session.css_class="css-class";

next send bellow variable to view and show

msg=req.utility.flushMsg(req)
Slug
create a slug follow bellow step
slug=req.utility.slug(product_name)