SlideShare a Scribd company logo
node.js
practical guide to javascript on server
javascript fast/memory suck:(
node
V8
libuv
OS
single threaded/non blocking
OS
thread
f() f() f() f() f()
iocall1
iocall2
callback1
callback2
heavy functions block server
node
worker worker worker worker
so
what you shouldn't do with
node?
• real real time :)
• data bending
without streams
filesystem
web
nodeserver
nodeserver
filesystem
web
with streams
readStream.pipe(writeStream)	
  
//file.pipe(response);
fs.read('filename',	
  function(data){	
  
	
  	
  response.end(data);	
  
})
modules
module.exports = function () {} 

!
all modules should
be a single function
var	
  fs	
  =	
  require('fs');	
  
fs.readFile('filename',	
  function(data){console.log(data)})
npm	
  install	
  express	
  -­‐-­‐save
{	
  
	
  	
  "name":"pkgname",	
  
	
  	
  "version":	
  "0.3.0",	
  
	
  	
  "author":	
  "Eldar	
  Djafarov	
  <djkojb@gmail.com>",	
  
	
  	
  "dependencies":{	
  
	
  	
  	
  	
  "express":"3.4.0"	
  
	
  	
  }	
  
}	
  
npm scripts
//use	
  npm	
  scripts	
  
{	
  
	
  	
  "scripts":{	
  
	
  	
  	
  	
  "start":"node	
  start.js",	
  
	
  	
  	
  	
  "test":"node	
  test.js",	
  
	
  	
  	
  	
  "build":"grunt	
  build",	
  
	
  	
  	
  	
  "build":"node	
  ./node_modules/grunt-­‐cli/.bin/grunt	
  build"	
  
	
  	
  }	
  
}	
  
	
  	
  
$	
  npm	
  start	
  //	
  starts	
  an	
  app	
  
$	
  npm	
  test	
  //	
  runs	
  tests	
  
$	
  npm	
  run	
  build	
  //	
  builds	
  an	
  app	
  
express deep dive
simple nodejs server

var	
  http	
  =	
  require('http');	
  
http.createServer(function	
  (req,	
  res)	
  {	
  
	
  	
  res.writeHead(200,	
  {'Content-­‐Type':	
  'text/plain'});	
  
	
  	
  res.end('Hello	
  Worldn');	
  
}).listen(1337,	
  '127.0.0.1');	
  
console.log('Server	
  running	
  at	
  http://127.0.0.1:1337/');	
  
simple express server

var	
  express	
  =	
  require('express');	
  
var	
  app	
  =	
  express();	
  
app.use(function	
  middleware(req,	
  res,	
  next){	
  
	
  	
  //	
  do	
  stuff	
  
	
  	
  next();	
  
});	
  
app.get('/',	
  function(req,	
  res,	
  next){	
  
	
  	
  res.end('Hello	
  Worldn');	
  
});	
  
app.listen(1337);	
  
opinionated top level app
architecture
SPA
REST
API
DB
Angularjs
or
backbone
node.js
express
mongoose
mongodb
express rendering
add engine

app.engine('jade',	
  require('jade').__express);	
  
app.engine('html',	
  require('ejs').renderFile);	
  
render templates

res.render('index',	
  function(err,	
  html){	
  
	
  	
  res.send(html);	
  
});	
  
	
  	
  
res.render('user',	
  {	
  name:	
  'Tobi'	
  },	
  function(err,	
  html){	
  
	
  	
  res.send(html);	
  
});	
  
express deep dive
middleware concept

function	
  middleware(req,	
  res,	
  next){	
  	
  	
  
	
  	
  doAsyncStuff(asyncStuffDone);	
  
	
  	
  function	
  asyncStuffDone(err,	
  data){	
  
	
  	
  	
  	
  if(err){	
  
	
  	
  	
  	
  	
  	
  next(err);	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  next();	
  
	
  	
  }	
  
}	
  
middleware
middleware
middleware
middleware
request
response
express deep dive
middleware concept

request middleware
middleware
middleware
middleware
app.router
GET /
POST /profile
middleware
middleware
middleware
middleware
middleware
middleware
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(express.router)	
  
app.get('/',	
  middleware,	
  middleware,...,middleware)	
  
app.post('/profile',	
  middleware,	
  middleware,...,middleware)	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
express deep dive
middleware concept

request middleware
static
middleware
middleware
app.router
GET /
POST /profile
middleware
middleware
middleware
middleware
middleware
middleware
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(express.router)	
  
app.get('/',	
  middleware,	
  middleware,...,middleware)	
  
app.post('/profile',	
  middleware,	
  middleware,...,middleware)	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
!
app.use(express.static('./public'));	
  
!
app.use(middleware);
app.use(middleware);	
  
!
app.use('/static',express.static('./public'));	
  
!
app.use(middleware);
or	
  serve	
  public	
  with	
  /static
express deep dive
middleware concept

request middleware
middleware
middleware
middleware
app.router
GET /
POST /profile
middleware
middleware
middleware
middleware
middleware
error
middleware
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(express.router)	
  
app.get('/',	
  middleware,	
  middleware,...,middleware)	
  
app.post('/profile',	
  middleware,	
  middleware,...,middleware)	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
module.exports	
  =	
  function(err,	
  req,	
  res,	
  next){	
  
	
  	
  if(err){	
  
	
  	
  	
  	
  if(err.isError){	
  
	
  	
  	
  	
  	
  	
  return	
  res.json(err.code,	
  {err.reason});	
  
	
  	
  	
  	
  }	
  
	
  	
  }	
  
	
  	
  res.json(500,	
  {	
  
	
  	
  	
  	
  message:	
  'Something	
  is	
  terribly	
  wrong'	
  
	
  	
  });	
  
}	
  
express deep dive
middleware concept

request middleware
middleware
auth middle
middleware
app.router
GET /
POST /profile
middleware
middleware
middleware
middleware
middleware
middleware
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(express.router)	
  
app.get('/',	
  middleware,	
  middleware,...,middleware)	
  
app.post('/profile',	
  middleware,	
  middleware,...,middleware)	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
authentication
function	
  authentication(req,	
  res,	
  next){	
  
	
  	
  getUserBySessionId(req.session.uid,	
  gotUser);	
  
	
  	
  function	
  gotUser(err,	
  user){	
  
	
  	
  	
  	
  if(err)	
  return	
  next(err);	
  
	
  	
  	
  	
  if(!user){	
  
	
  	
  	
  	
  	
  	
  req.user	
  =	
  "guest";	
  
	
  	
  	
  	
  }else{	
  
	
  	
  	
  	
  	
  	
  req.user	
  =	
  user;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  next();	
  
	
  	
  }	
  
}	
  
express deep dive
middleware concept

request middleware
middleware
middleware
middleware
app.router
GET /
POST /profile
middleware
middleware
middleware
middleware
middleware
middleware
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(express.router)	
  
app.get('/',	
  middleware,	
  middleware,...,middleware)	
  
app.post('/profile',	
  middleware,	
  middleware,...,middleware)	
  
app.use(middleware);	
  
app.use(middleware);	
  
app.use(middleware);	
  
authorization
app.get('/user/:id',	
  userAccessOnly,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  featureAccess('getUser'),	
  getUser);	
  
!
app.delete('/user/:id',	
  userAccessOnly,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  featureAccess('deleteUser'),	
  deleteUser);	
  
!
app.put('/profile',	
  userAccessOnly,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  featureAccess('editProfile'),	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  validateProfile,	
  editProfile);	
  
if(!req.user.features[feature]){	
  
	
  	
  return	
  next(err.notAutorized())	
  
}	
  
if(!req.user){	
  
	
  	
  return	
  next(err.noAuth());	
  
}	
  
next();	
  
var	
  uid	
  =	
  req.param('id');	
  
Users.delete(uid,	
  userGone);	
  
function	
  userGone(err){	
  
	
  	
  if(err)	
  next(err);	
  
	
  	
  res.json({message:"OK"});	
  
}	
  
testing Use mocha + chai + request
describe("User	
  passes	
  authentication",	
  function(){	
  
	
  	
  before(function(done){	
  
	
  	
  	
  	
  request.post('/api/auth',	
  {form:{login:login,	
  pwd:password}},	
  authDone);	
  
	
  	
  	
  	
  function	
  authDone(err,	
  response,	
  body){	
  
	
  	
  	
  	
  	
  	
  expect(response).to.have.property('statusCode',	
  200);	
  
	
  	
  	
  	
  	
  	
  done();	
  
	
  	
  	
  	
  }	
  
	
  	
  })	
  
	
  	
  describe("GET	
  /api/users	
  tries	
  to	
  get	
  all	
  users",	
  function(){	
  
	
  	
  	
  	
  var	
  users;	
  
	
  	
  	
  	
  before(function(done){	
  
	
  	
  	
  	
  	
  	
  request.get('/api/users',	
  gotUsers);	
  
	
  	
  	
  	
  	
  	
  function	
  gotUsers(err,	
  response,	
  data){	
  
	
  	
  	
  	
  	
  	
  	
  	
  users	
  =	
  data;	
  
	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  })	
  
	
  	
  	
  	
  it('returned	
  data	
  should	
  be	
  json',	
  function(){	
  
	
  	
  	
  	
  	
  	
  users	
  =	
  JSON.parse(users);	
  
	
  	
  	
  	
  	
  	
  expect(users).to.be.an('object');	
  
	
  	
  	
  	
  });	
  
	
  	
  	
  	
  it('there	
  should	
  be	
  >	
  5	
  users',	
  function(){	
  
	
  	
  	
  	
  	
  	
  expect(users).to.have.length.above(5);	
  
	
  	
  	
  	
  })	
  
	
  	
  	
  	
  ...	
  
	
  	
  })	
  
})
RESTful webservices
Resources are nouns
HTTP request types are verbs

resource
POST
create
GET
read
PUT
update
DELETE
delete
/dogs
create new
dog
list dogs
bulk update
dogs
bulk
remove
dogs
/dogs/:id error read dog
update dog
if exists
else error
delete dog
GET /dogs?color=red&state=running&location=park
Complex stuff optional after ‘?’ sign

bitly.com/restfulApi
environment
Use flation/nconf module
var	
  APP_ENV	
  =	
  process.env.APP_ENV||'development';	
  
nconf	
  =	
  require('nconf');	
  
nconf.argv()	
  
	
  	
  	
  	
  	
  .env()	
  
	
  	
  	
  	
  	
  .file({file:'./config/'+APP_ENV+'.config.json'});	
  
	
  	
  
nconf.get('app:host');	
  
nconf.get('app:port');	
  
nconf.get('security:salt');	
  
Q&A
СЛАВА УКРАЇНІ!
@edjafarov	

eldar.djafarov.com

More Related Content

PDF
Unit Testing Express Middleware
PPTX
Full Stack Unit Testing
PDF
Unit Testing Express and Koa Middleware in ES2015
PDF
Unit testing JavaScript using Mocha and Node
PDF
Unit testing with mocha
PDF
Jasmine - why JS tests don't smell fishy
PDF
Advanced Jasmine - Front-End JavaScript Unit Testing
PPTX
Javascript Testing with Jasmine 101
Unit Testing Express Middleware
Full Stack Unit Testing
Unit Testing Express and Koa Middleware in ES2015
Unit testing JavaScript using Mocha and Node
Unit testing with mocha
Jasmine - why JS tests don't smell fishy
Advanced Jasmine - Front-End JavaScript Unit Testing
Javascript Testing with Jasmine 101

What's hot (20)

PPT
Testing Javascript with Jasmine
PDF
Jasmine BDD for Javascript
PDF
We Are All Testers Now: The Testing Pyramid and Front-End Development
PDF
Practical Celery
PDF
JavaScript TDD with Jasmine and Karma
PDF
Quick tour to front end unit testing using jasmine
PDF
PDF
Intro to testing Javascript with jasmine
PDF
Celery: The Distributed Task Queue
PDF
The JavaFX Ecosystem
PDF
Sane Sharding with Akka Cluster
PDF
Celery
PDF
Testing JavaScript Applications
PDF
Painless JavaScript Testing with Jest
PDF
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
PPTX
Unit testing in JavaScript with Jasmine and Karma
PDF
AngularJS Unit Testing w/Karma and Jasmine
ODP
Unit Testing and Coverage for AngularJS
PDF
An Introduction to Celery
PDF
Celery - A Distributed Task Queue
Testing Javascript with Jasmine
Jasmine BDD for Javascript
We Are All Testers Now: The Testing Pyramid and Front-End Development
Practical Celery
JavaScript TDD with Jasmine and Karma
Quick tour to front end unit testing using jasmine
Intro to testing Javascript with jasmine
Celery: The Distributed Task Queue
The JavaFX Ecosystem
Sane Sharding with Akka Cluster
Celery
Testing JavaScript Applications
Painless JavaScript Testing with Jest
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
Unit testing in JavaScript with Jasmine and Karma
AngularJS Unit Testing w/Karma and Jasmine
Unit Testing and Coverage for AngularJS
An Introduction to Celery
Celery - A Distributed Task Queue
Ad

Similar to node.js practical guide to serverside javascript (20)

PDF
Build web application by express
PPTX
Building Web Apps with Express
PDF
Build Web Apps using Node.js
PPTX
Express JS
KEY
Writing robust Node.js applications
KEY
How and why i roll my own node.js framework
PDF
Node js introduction
PDF
soft-shake.ch - Hands on Node.js
PPTX
NodeJS
PDF
Nodejs first class
PPTX
NodeJs
PDF
Writing RESTful web services using Node.js
PDF
async/await in Swift
PDF
Future Decoded - Node.js per sviluppatori .NET
PDF
NodeJS and ExpressJS.pdf
KEY
JavaScript Growing Up
PDF
Real Time App with Node.js
PDF
Matthew Eernisse, NodeJs, .toster {webdev}
PDF
Make WordPress realtime.
PPT
Building your first Node app with Connect & Express
Build web application by express
Building Web Apps with Express
Build Web Apps using Node.js
Express JS
Writing robust Node.js applications
How and why i roll my own node.js framework
Node js introduction
soft-shake.ch - Hands on Node.js
NodeJS
Nodejs first class
NodeJs
Writing RESTful web services using Node.js
async/await in Swift
Future Decoded - Node.js per sviluppatori .NET
NodeJS and ExpressJS.pdf
JavaScript Growing Up
Real Time App with Node.js
Matthew Eernisse, NodeJs, .toster {webdev}
Make WordPress realtime.
Building your first Node app with Connect & Express
Ad

More from Eldar Djafarov (6)

PDF
PromisePipe inception
PDF
The Grail: React based Isomorph apps framework
PDF
Frontend - экосистема и будущее: iforum 2015
PDF
React.js or why DOM finally makes sense
PDF
Compy slides
PDF
Your project tested #nodejs
PromisePipe inception
The Grail: React based Isomorph apps framework
Frontend - экосистема и будущее: iforum 2015
React.js or why DOM finally makes sense
Compy slides
Your project tested #nodejs

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Approach and Philosophy of On baking technology
PPTX
Spectroscopy.pptx food analysis technology
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
Machine learning based COVID-19 study performance prediction
Network Security Unit 5.pdf for BCA BBA.
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Big Data Technologies - Introduction.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
Programs and apps: productivity, graphics, security and other tools
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Approach and Philosophy of On baking technology
Spectroscopy.pptx food analysis technology
Per capita expenditure prediction using model stacking based on satellite ima...
The AUB Centre for AI in Media Proposal.docx
Understanding_Digital_Forensics_Presentation.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Dropbox Q2 2025 Financial Results & Investor Presentation
sap open course for s4hana steps from ECC to s4
Spectral efficient network and resource selection model in 5G networks
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Advanced methodologies resolving dimensionality complications for autism neur...

node.js practical guide to serverside javascript

  • 1. node.js practical guide to javascript on server
  • 4. single threaded/non blocking OS thread f() f() f() f() f() iocall1 iocall2 callback1 callback2
  • 5. heavy functions block server node worker worker worker worker so
  • 6. what you shouldn't do with node? • real real time :) • data bending
  • 7. without streams filesystem web nodeserver nodeserver filesystem web with streams readStream.pipe(writeStream)   //file.pipe(response); fs.read('filename',  function(data){      response.end(data);   })
  • 8. modules module.exports = function () {} ! all modules should be a single function var  fs  =  require('fs');   fs.readFile('filename',  function(data){console.log(data)}) npm  install  express  -­‐-­‐save {      "name":"pkgname",      "version":  "0.3.0",      "author":  "Eldar  Djafarov  <djkojb@gmail.com>",      "dependencies":{          "express":"3.4.0"      }   }  
  • 9. npm scripts //use  npm  scripts   {      "scripts":{          "start":"node  start.js",          "test":"node  test.js",          "build":"grunt  build",          "build":"node  ./node_modules/grunt-­‐cli/.bin/grunt  build"      }   }       $  npm  start  //  starts  an  app   $  npm  test  //  runs  tests   $  npm  run  build  //  builds  an  app  
  • 10. express deep dive simple nodejs server
 var  http  =  require('http');   http.createServer(function  (req,  res)  {      res.writeHead(200,  {'Content-­‐Type':  'text/plain'});      res.end('Hello  Worldn');   }).listen(1337,  '127.0.0.1');   console.log('Server  running  at  http://127.0.0.1:1337/');   simple express server
 var  express  =  require('express');   var  app  =  express();   app.use(function  middleware(req,  res,  next){      //  do  stuff      next();   });   app.get('/',  function(req,  res,  next){      res.end('Hello  Worldn');   });   app.listen(1337);  
  • 11. opinionated top level app architecture SPA REST API DB Angularjs or backbone node.js express mongoose mongodb
  • 12. express rendering add engine
 app.engine('jade',  require('jade').__express);   app.engine('html',  require('ejs').renderFile);   render templates
 res.render('index',  function(err,  html){      res.send(html);   });       res.render('user',  {  name:  'Tobi'  },  function(err,  html){      res.send(html);   });  
  • 13. express deep dive middleware concept
 function  middleware(req,  res,  next){          doAsyncStuff(asyncStuffDone);      function  asyncStuffDone(err,  data){          if(err){              next(err);          }          next();      }   }   middleware middleware middleware middleware request response
  • 14. express deep dive middleware concept
 request middleware middleware middleware middleware app.router GET / POST /profile middleware middleware middleware middleware middleware middleware app.use(middleware);   app.use(middleware);   app.use(middleware);   app.use(express.router)   app.get('/',  middleware,  middleware,...,middleware)   app.post('/profile',  middleware,  middleware,...,middleware)   app.use(middleware);   app.use(middleware);   app.use(middleware);  
  • 15. express deep dive middleware concept
 request middleware static middleware middleware app.router GET / POST /profile middleware middleware middleware middleware middleware middleware app.use(middleware);   app.use(middleware);   app.use(middleware);   app.use(express.router)   app.get('/',  middleware,  middleware,...,middleware)   app.post('/profile',  middleware,  middleware,...,middleware)   app.use(middleware);   app.use(middleware);   app.use(middleware);   app.use(middleware);   ! app.use(express.static('./public'));   ! app.use(middleware); app.use(middleware);   ! app.use('/static',express.static('./public'));   ! app.use(middleware); or  serve  public  with  /static
  • 16. express deep dive middleware concept
 request middleware middleware middleware middleware app.router GET / POST /profile middleware middleware middleware middleware middleware error middleware app.use(middleware);   app.use(middleware);   app.use(middleware);   app.use(express.router)   app.get('/',  middleware,  middleware,...,middleware)   app.post('/profile',  middleware,  middleware,...,middleware)   app.use(middleware);   app.use(middleware);   app.use(middleware);   module.exports  =  function(err,  req,  res,  next){      if(err){          if(err.isError){              return  res.json(err.code,  {err.reason});          }      }      res.json(500,  {          message:  'Something  is  terribly  wrong'      });   }  
  • 17. express deep dive middleware concept
 request middleware middleware auth middle middleware app.router GET / POST /profile middleware middleware middleware middleware middleware middleware app.use(middleware);   app.use(middleware);   app.use(middleware);   app.use(express.router)   app.get('/',  middleware,  middleware,...,middleware)   app.post('/profile',  middleware,  middleware,...,middleware)   app.use(middleware);   app.use(middleware);   app.use(middleware);   authentication function  authentication(req,  res,  next){      getUserBySessionId(req.session.uid,  gotUser);      function  gotUser(err,  user){          if(err)  return  next(err);          if(!user){              req.user  =  "guest";          }else{              req.user  =  user;          }          next();      }   }  
  • 18. express deep dive middleware concept
 request middleware middleware middleware middleware app.router GET / POST /profile middleware middleware middleware middleware middleware middleware app.use(middleware);   app.use(middleware);   app.use(middleware);   app.use(express.router)   app.get('/',  middleware,  middleware,...,middleware)   app.post('/profile',  middleware,  middleware,...,middleware)   app.use(middleware);   app.use(middleware);   app.use(middleware);   authorization app.get('/user/:id',  userAccessOnly,                    featureAccess('getUser'),  getUser);   ! app.delete('/user/:id',  userAccessOnly,                    featureAccess('deleteUser'),  deleteUser);   ! app.put('/profile',  userAccessOnly,                    featureAccess('editProfile'),                    validateProfile,  editProfile);   if(!req.user.features[feature]){      return  next(err.notAutorized())   }   if(!req.user){      return  next(err.noAuth());   }   next();   var  uid  =  req.param('id');   Users.delete(uid,  userGone);   function  userGone(err){      if(err)  next(err);      res.json({message:"OK"});   }  
  • 19. testing Use mocha + chai + request describe("User  passes  authentication",  function(){      before(function(done){          request.post('/api/auth',  {form:{login:login,  pwd:password}},  authDone);          function  authDone(err,  response,  body){              expect(response).to.have.property('statusCode',  200);              done();          }      })      describe("GET  /api/users  tries  to  get  all  users",  function(){          var  users;          before(function(done){              request.get('/api/users',  gotUsers);              function  gotUsers(err,  response,  data){                  users  =  data;              }          })          it('returned  data  should  be  json',  function(){              users  =  JSON.parse(users);              expect(users).to.be.an('object');          });          it('there  should  be  >  5  users',  function(){              expect(users).to.have.length.above(5);          })          ...      })   })
  • 20. RESTful webservices Resources are nouns HTTP request types are verbs
 resource POST create GET read PUT update DELETE delete /dogs create new dog list dogs bulk update dogs bulk remove dogs /dogs/:id error read dog update dog if exists else error delete dog GET /dogs?color=red&state=running&location=park Complex stuff optional after ‘?’ sign
 bitly.com/restfulApi
  • 21. environment Use flation/nconf module var  APP_ENV  =  process.env.APP_ENV||'development';   nconf  =  require('nconf');   nconf.argv()            .env()            .file({file:'./config/'+APP_ENV+'.config.json'});       nconf.get('app:host');   nconf.get('app:port');   nconf.get('security:salt');