Open Files
Folders

REST with Node.js

Mental Map

REST + Node.js?

REST + PHP

REST + Nodejs

Node.js

server.js


var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello New York\n');
}).listen(3001, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3001/');

Node.js

Terminal command


$ cd noderest/
$ node server.js

Node.js

start node

Node.js

server started


Add Dependencies

Express: App Framework for Node

package.json


{
    "name": "Node REST Demo",
    "description": "Demo REST API with Node",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
        "express": "3.x"
    }
}

Install Dependencies

Express is only dependency


$ npm install

Express

installing

Add Express

server.js


var express = require('express');

var app = express();

app.get('/', function(req, res) {
    res.send('Hello Seattle\n');
});

app.listen(3001);
console.log('Listening on port 3001...');

Express

restart Node with Express

CTRL+C

Node and Express

serving different headers

Routes


app.get('/path', function(req, res) {
    res.send('Return JSON or HTML View');
});

Request

req


app.get('/musician/:name', function(req, res) {

    // Get /musician/Matt
    console.log(req.params.name)
    // => Matt
    
    res.send('{"id": 1,"name":"Matt", 
      "band":"BBQ Brawlers"}');
});

Response

res


res.send({ some: 'json' });
res.send("html for Maximum Pain's web page");
res.send(404, 'No musicians here');
res.send(500, { error: 'you blew it' });
res.send(200);

HTTP verbs

routes.js


module.exports = function(app){
  var musicians = require('./controllers/musicians');
  
  app.get('/musicians', musicians.findAll);
  app.get('/musicians/:id', musicians.findById);
  app.post('/musicians', musicians.add);
  app.put('/musicians/:id', musicians.update);
  app.delete('/musicians/:id', musicians.delete);
}

JS Modules

controllers/musicians.js


exports.findAll = function(req, res){
  res.send([{
    "id": 1,
    "name": "Max",
    "band": "Maximum Pain",
    "instrument": "guitar"
  }]);
};

Import Routes and JS Modules

server.js


var express = require('express');

var app = express();             

require('routes')(app);

app.listen(3001);
console.log("Jammin\' on port 3001...");

Node.js

restart node server

CTRL+C

REST GET

/musicians

Mongo DB

controllers/musicians.js


var mongoose = require('mongoose'),
Musician = mongoose.model('Musician');

exports.findAll = function(req, res){
  Musician.find({},function(err, results) {
    return res.send(results);
  });
};

MongoDB

start mongo


$ mongod

Mongoose.js

install Mongo Node model framework


$ npm install mongoose --save-dev

Mongoose.js

installing

Update Server

server.js

var express = require('express'),
mongoose = require('mongoose'),
fs = require('fs');

var mongoUri = 'mongodb://localhost/noderest_project'; 
mongoose.connect(mongoUri);
var db = mongoose.connection;
db.on('error', function () {
  throw new Error('unable to connect to database at ' + mongoUri);
});

var app = express();

app.configure(function(){
  app.use(express.bodyParser());
});

require('./models/musicians')
require('./routes')(app);

app.listen(3001);
console.log('Listening on port 3001...');

Model Schema

models/musician.js

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var MusicianSchema = new Schema({
  name: String,
  band: String,
  instrument: String
});

mongoose.model('Musician', MusicianSchema);

Mongo

restart Node with Mongo

CTRL+C

REST GET

/musicians

Mongo Data Import

add route to routes.js

app.get('/import', musicians.import);  

Mongo Data Import

add method to controller/musicians.js

exports.import = function(req, res){
  Musician.create(
    { "name": "Ben", "band": "DJ Code Red", "instrument": "Reason" },
    { "name": "Mike D.","band": "Kingston Kats", "instrument": "drums" },
    { "name": "Eric", "band": "Eric", "instrument": "piano" },
    { "name": "Paul", "band": "The Eyeliner", "instrument": "guitar" }   
  , function (err) {                
    if (err) return console.log(err); 
    return res.send(202);
  });
};

Node.js

restart node server

CTRL+C

Run Import

/import

Data Imported

/musicians

Route GET to findAll

app.get('/musicians', musicians.findAll);


exports.findAll = function(req, res){
  Musician.find({},function(err, results) {
    return res.send(results);
  });
};    

Route GET to findById

app.get('/musicians/:id', musicians.findById);


exports.findById = function(req, res){
  var id = req.params.id;
  Musician.findOne({'_id':id},function(err, result) {
    return res.send(result);
  });
};

GET by Id

/musicians/:id

Route PUT to update

app.put('/musicians/:id', musicians.update);


exports.update = function(req, res) {
  var id = req.params.id;
  var updates = req.body;
  
  Musician.update({'_id':id}, req.body, 
    function (err, numberAffected) {
      if (err) return console.log(err);
      console.log('Updated %d musicians', numberAffected);
  });
}   

PUT

use cURL to test


$ curl -i -X PUT -H 'Content-Type: application/json' 
  -d '{"band": "BBQ Brawlers"}' 
  http://localhost:3001/musicians/535fe13ac688500000c2b28b

Updated

/musicians/:id

Route POST to add

app.post('/musicians', musicians.add);


exports.add = function(req, res) {
  Musician.create(req.body, function (err, musician) {
    if (err) return console.log(err); 
    return res.send(musician);
  });
}   

POST

use cURL to test


$ curl -i -X POST -H 'Content-Type: application/json' -d 
  '{"name": "Joe", "band": "Abita Boys",
  "instrument":"voice"}' 
  http://localhost:3001/musicians 

Added

/musicians

Route DELETE to delete

app.delete('/musicians/:id', musicians.delete);


exports.delete = function(req, res){
  var id = req.params.id;
  Musician.remove({'_id':id},function(result) {
    return res.send(result);
  });
};

DELETE

use cURL to test


$ curl -i -X DELETE 
  http://localhost:3001/musicians/535feac1cc539500000a209f

Deleted

/musicians

Thanks

Reference

Express API ReferenceMongoose.js API docsCreating a REST API using Node.js, Express, and MongoDBBespoke.js