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