SlideShare a Scribd company logo
1 of 22
Download to read offline
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

What's hot

What's hot (20)

Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with Jasmine
 
Jasmine BDD for Javascript
Jasmine BDD for JavascriptJasmine BDD for Javascript
Jasmine BDD for Javascript
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End DevelopmentWe Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End Development
 
Practical Celery
Practical CeleryPractical Celery
Practical Celery
 
JavaScript TDD with Jasmine and Karma
JavaScript TDD with Jasmine and KarmaJavaScript TDD with Jasmine and Karma
JavaScript TDD with Jasmine and Karma
 
Quick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmineQuick tour to front end unit testing using jasmine
Quick tour to front end unit testing using jasmine
 
Celery
CeleryCelery
Celery
 
Intro to testing Javascript with jasmine
Intro to testing Javascript with jasmineIntro to testing Javascript with jasmine
Intro to testing Javascript with jasmine
 
Celery: The Distributed Task Queue
Celery: The Distributed Task QueueCelery: The Distributed Task Queue
Celery: The Distributed Task Queue
 
The JavaFX Ecosystem
The JavaFX EcosystemThe JavaFX Ecosystem
The JavaFX Ecosystem
 
Sane Sharding with Akka Cluster
Sane Sharding with Akka ClusterSane Sharding with Akka Cluster
Sane Sharding with Akka Cluster
 
Celery
CeleryCelery
Celery
 
Testing JavaScript Applications
Testing JavaScript ApplicationsTesting JavaScript Applications
Testing JavaScript Applications
 
Painless JavaScript Testing with Jest
Painless JavaScript Testing with JestPainless JavaScript Testing with Jest
Painless JavaScript Testing with Jest
 
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma JavaScript Test-Driven Development with Jasmine 2.0 and Karma
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
 
Unit testing in JavaScript with Jasmine and Karma
Unit testing in JavaScript with Jasmine and KarmaUnit testing in JavaScript with Jasmine and Karma
Unit testing in JavaScript with Jasmine and Karma
 
AngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and JasmineAngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and Jasmine
 
Unit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSUnit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJS
 
An Introduction to Celery
An Introduction to CeleryAn Introduction to Celery
An Introduction to Celery
 
Celery - A Distributed Task Queue
Celery - A Distributed Task QueueCelery - A Distributed Task Queue
Celery - A Distributed Task Queue
 

Similar to node.js practical guide to serverside javascript

Build web application by express
Build web application by expressBuild web application by express
Build web application by express
Shawn Meng
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
Tom Croucher
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
Ben Lin
 
Node js introduction
Node js introductionNode js introduction
Node js introduction
Alex Su
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
David Padbury
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
.toster
 

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

Build web application by express
Build web application by expressBuild web application by express
Build web application by express
 
Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with Express
 
Build Web Apps using Node.js
Build Web Apps using Node.jsBuild Web Apps using Node.js
Build Web Apps using Node.js
 
Express JS
Express JSExpress JS
Express JS
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
 
Node js introduction
Node js introductionNode js introduction
Node js introduction
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 
NodeJS
NodeJSNodeJS
NodeJS
 
Nodejs first class
Nodejs first classNodejs first class
Nodejs first class
 
NodeJs
NodeJsNodeJs
NodeJs
 
Writing RESTful web services using Node.js
Writing RESTful web services using Node.jsWriting RESTful web services using Node.js
Writing RESTful web services using Node.js
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in Swift
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NET
 
NodeJS and ExpressJS.pdf
NodeJS and ExpressJS.pdfNodeJS and ExpressJS.pdf
NodeJS and ExpressJS.pdf
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Real Time App with Node.js
Real Time App with Node.jsReal Time App with Node.js
Real Time App with Node.js
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
 
Make WordPress realtime.
Make WordPress realtime.Make WordPress realtime.
Make WordPress realtime.
 
Building your first Node app with Connect & Express
Building your first Node app with Connect & ExpressBuilding your first Node app with Connect & Express
Building your first Node app with Connect & Express
 

More from Eldar Djafarov

React.js or why DOM finally makes sense
React.js or why DOM finally makes senseReact.js or why DOM finally makes sense
React.js or why DOM finally makes sense
Eldar Djafarov
 
Your project tested #nodejs
Your project tested #nodejsYour project tested #nodejs
Your project tested #nodejs
Eldar Djafarov
 

More from Eldar Djafarov (6)

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

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 

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');