ddo/express-orm-mvc

View on GitHub
README.md

Summary

Maintainability
Test Coverage
express-orm-mvc
===============

[![NPM version](https://badge.fury.io/js/express-orm-mvc.png)](http://badge.fury.io/js/express-orm-mvc)
[![Dependency Status](https://gemnasium.com/ddo/express-orm-mvc.png)](https://gemnasium.com/ddo/express-orm-mvc)

[![Coverage Status](https://coveralls.io/repos/ddo/express-orm-mvc/badge.png?branch=master)](https://coveralls.io/r/ddo/express-orm-mvc?branch=master)
[![Code Climate](https://codeclimate.com/github/ddo/express-orm-mvc.png)](https://codeclimate.com/github/ddo/express-orm-mvc)

![codeship](https://www.codeship.io/projects/db0d6920-87f7-0131-c865-5eebdd5ccdbf/status)

As everyone the 1st time I start to use express, there was many problem i have to solve as

* Database
* 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 and scale up later
* No Express or ORM hack
* Config Express and ORM by yourself (Fully control)

##Dependencies

By default:

* [Express](https://github.com/visionmedia/express) ^4.0.0
* [ORM](https://github.com/dresende/node-orm2) ^2.1.5

You can specify those dependencies version by option, please refer to [this](#options)

##Installation

    npm install express-orm-mvc --save

Database package

    npm install <your database package>

    //example
    npm install mysql

Refer to ORM document [Connecting to Database](https://github.com/dresende/node-orm2/wiki/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](example) folder

##How to use

Please check [example](example) folder or follow these document

###Init

```js
require(express-orm-mvc)(function(err){
    if(err) {
        console.log(err);
        return;
    }
    console.log('done');
});
```

###Models

A model file should be like this

```js
module.exports = function (orm, db) {
    //define your orm model here
};
```

Example:

    models/post.js

```js
module.exports = function (orm, db) {
    var Post = db.define('post', {
        title:      { type: 'text' },
        content:    { type: 'text' }
    });
};
```

Check ORM document [Defining Models](https://github.com/dresende/node-orm2/wiki/Defining-Models)

####Note:

``express-orm-mvc`` loads models by alphabet order.

For example ``comment`` model has one ``post`` (many-to-one relationship) as ``post_id`` field, so ``post`` model must be loaded before ``comment`` model.

Solution: name the file models name as ``0_post.js`` and ``comment.js``.

You can check [example](example)

###Controllers

A controller file should be like this

```js
module.exports = {
    //define your controller here
};
```

Example:

    controllers/post.js

```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](#notes)

###Settings

    config/settings.js

A settings file should be like this

```js
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:

```js
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: 'express-orm-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: 'express-orm-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](#options)

Check ORM document [Connecting to Database](https://github.com/dresende/node-orm2/wiki/Connecting-to-Database)

###Express config

    config/express.js

A express config file should be like this

```js
module.exports = function(app, express) {
    //any express config here
};
```

Example:

```js
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](http://expressjs.com/api.html)

**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

```js
http.createServer(app).listen(function(){});
```

###ORM config

    config/orm.js

A orm config file should be like this

```js
module.exports = function(orm, db) {
    //any orm config here
};
```

Example:

```js
module.exports = function(orm, db) {
    db.settings.set('test', 'testing data');
};
```

Check ORM document [Settings](https://github.com/dresende/node-orm2/wiki/Settings)

**Note**: Library will [sync database](https://github.com/dresende/node-orm2/wiki/Synching-and-Dropping-Models#wiki-synching) automatically.

###Routes config

    config/routes.js

A routes config file should be like this

```js
module.exports = function(app, controllers) {
    //routes here
};
```

Example:

```js
module.exports = function(app, controllers) {
    app.get(    '/'       , controllers.post.home);
    app.get(    '/post'   , controllers.post.get);
    app.post(   '/post'   , controllers.post.create);
};
```

##Options

```js
require(express-orm-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:

```js
var express = require('express')    // Express 4
var orm = require('orm')            // ORM 2.1.0

require(express-orm-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

```js
require(express-orm-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

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

###from express config file

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

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