NODEJS(6)Expressjs and REST

AABBbaby 2014-05-27

NODEJS(6)Expressjs and REST

1. Prepare the dependency
Check the Latest Version
>npm info monk version
npm http GET https://registry.npmjs.org/monk

npm http 304 https://registry.npmjs.org/monk 0.9.0

>pm info express version
4.2.0

I know I will use express as my web frame working to handle the request and dispatcher. Monk to handle the mongodb connection.
So package.json will be as follow>
{
     "name": "buglist",
     "version": "0.0.1",
     "private": true,
     "dependencies": {
          "express": "4.2.0",
          "monk": "0.9.0",
          "body-parser": "1.2.0"
     }
}

2. How they work together
app.js will use express to listen to a port and serve as http server.
var express = require('express');
var bodyParser = require('body-parser'); 

var app = express();
app.use(bodyParser());
app.use(bodyParser.json({ type: 'application/vnd.api+json' }))

var bug_module = require('./bug/route');

app.use('/bugs', bug_module);
 
app.set('port', process.env.PORT || 3001);
app.listen(app.get('port'));
console.log('Running nodeJS on port ' + app.get('port') + ' !');

Router will be handle by express.Router() in route.js in every module
var express = require('express');
var router = express.Router();

var action = require('./action');

/* GET users listing. */
router.get('/', action.getAll);
router.post('/', action.create);
router.get('/:id', action.get);
router.put('/:id', action.update);
router.delete('/:id', action.del);

module.exports = router;

action.js and config.json will handle the connection between request and mongodb, and the limit business logic will be in here.
{
     "host": "localhost",
     "port": 27010,
     "dbname": "buglist"
}

var config = require('../config.json');
var monk = require('monk');
var db = monk(config.host+":"+config.port+'/'+config.dbname);
var collection = db.get('bugs');

// Returns all the bugs
exports.getAll = function(req, res) {
     collection.find({}, function(err, bugs){
          if (err) res.json(500, err);
          else res.json(bugs);
     });
};

// Creates a bug
exports.create = function(req, res) {
     var body = req.body;
     console.log("post body  = " + body);
     console.log("create title = " + body.title);
     console.log("create creation = " + body.creation);
     console.log("create status = " + body.status);
     console.log("create assignee = " + body.assignee);
     collection.insert(body, function(err, bug){
          if (err) res.json(500, err);
          else res.json(201, bug);
     });
};

// Get a bug
exports.get = function(req, res) {
     var id = req.params.id;
     collection.findById(id, function(err, bug){
          if (err) res.json(500, err);
          else if (bug) res.json(bug);
          else res.send(404);
     });
};

// Updates a bug
exports.update = function(req, res) {
     var id = req.params.id;
     var body = req.body;
     delete body._id;
     collection.findAndModify({_id: id}, {$set: body}, {multi:false, new:true}, function(err, bug){
          if (err) res.json(500, err);
          else if (bug) res.json(bug);
          else res.send(404);
     });
};

// Deletes a bug
exports.del = function(req, res) {
     var id = req.params.id;
     collection.remove({_id: id}, function(err){
          if (err) res.json(500, err);
          else res.send(204);
     });
};


3. How to Deploy 
Command to Start the Server
>DEBUG=express:* node app.js

Show the Debug Message for express and monk
>DEBUG="express:* monk:*" node app.js

Put a port Number in the Command Line
>PORT=3002 DEBUG="express:* monk:*" node app.js

In the app.js, add these things to support that>
app.set('port', process.env.PORT || 3001);
app.listen(app.get('port'));
console.log('Running nodeJS on port ' + app.get('port') + ' !');

Tips:
1. Body Parser Problem.
Error Message>
Most middleware (like bodyParser) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.

Error: Cannot find module 'body-parser'

Solution>
>npm info body-parser version
npm http GET https://registry.npmjs.org/body-parsernpm http 200 https://registry.npmjs.org/body-parser1.2.0


References:
http://sillycat.iteye.com/admin/blogs/2067546
https://github.com/vdurmont/express-monk-mongodb-example
http://www.vincent-durmont.com/2013/11/29/first-rest-api-with-node-express-monk-and-mongodb.html
body parser document
https://github.com/expressjs/body-parser
monk document
https://github.com/LearnBoost/monk
port number discuss
http://stackoverflow.com/questions/18008620/node-js-express-js-app-only-works-on-port-3000

Make the nodejs app live for ever
https://github.com/nodejitsu/forever
https://github.com/Unitech/pm2