Slide 1

Slide 1 text

HTTP WEB API w/ nodejs & mongodb build a

Slide 2

Slide 2 text

tweet tweet @donnfelker

Slide 3

Slide 3 text

speakerdeck.com/donnfelker/

Slide 4

Slide 4 text

github.com/donnfelker/hapi-mongodb-example

Slide 5

Slide 5 text

topics nodejs hapi mongoose mongodb

Slide 6

Slide 6 text

beginner | intermediate (know some javascript and understand callbacks and ‘sorta’ grok mongodb)

Slide 7

Slide 7 text

what is ?

Slide 8

Slide 8 text

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices. -nodejs.org

Slide 9

Slide 9 text

standing on the shoulders of giants

Slide 10

Slide 10 text

hosting | paas

Slide 11

Slide 11 text

how do I build a web api with nodejs?

Slide 12

Slide 12 text

basic tools blank slate start with vanilla nodejs

Slide 13

Slide 13 text

that’s raw. lets use some tools.

Slide 14

Slide 14 text

hapi server framework for node.js expressjs.com

Slide 15

Slide 15 text

hapijs.com | walmart labs

Slide 16

Slide 16 text

var  Hapi  =  require('hapi');

Slide 17

Slide 17 text

var  Hapi  =  require('hapi'); var  server  =  new  Hapi.Server('localhost',  8000);

Slide 18

Slide 18 text

var  Hapi  =  require('hapi'); var  server  =  new  Hapi.Server('localhost',  8000); var  handler  =  function(request,  reply)  {   reply({  message:  "Hello  from  Hapi.js!"}); };

Slide 19

Slide 19 text

var  Hapi  =  require('hapi'); var  server  =  new  Hapi.Server('localhost',  8000); var  handler  =  function(request,  reply)  {   reply({  name:  "Ian"}); }; server.route({   method:  'GET',   path:  '/user',   handler:  handler });

Slide 20

Slide 20 text

var  Hapi  =  require('hapi'); var  server  =  new  Hapi.Server('localhost',  8000); var  handler  =  function(request,  reply)  {   reply({  name:  "Ian"}); }; server.route({   method:  'GET',   path:  '/user',   handler:  handler }); server.start(function  ()  {        console.log('Server  started  at:  '  +  server.info.uri); });

Slide 21

Slide 21 text

var  Hapi  =  require('hapi'); var  server  =  new  Hapi.Server('localhost',  8000); var  handler  =  function(request,  reply)  {   reply({  name:  "Ian"}); }; server.route({   method:  'GET',   path:  '/user',   handler:  handler }); server.start(function  ()  {        console.log('Server  started  at:  '  +  server.info.uri); });

Slide 22

Slide 22 text

server.route({   method:  'GET',   path:  '/user',   config:  userHandler });

Slide 23

Slide 23 text

server.route({   method:  'GET',   path:  '/user',   config:  {     handler:  rootHandler,     cache:  {       expiresIn:  5  *  60  *  1000,     }   } });

Slide 24

Slide 24 text

server.route({   method:  'GET',   path:  '/user',   config:  {     handler:  rootHandler,     cache:  {       expiresIn:  5  *  60  *  1000, staleIn:  4  *  60  *  1000, staleTimeout:  200     }   } });

Slide 25

Slide 25 text

server.route({   method:  'GET',   path:  '/user',   config:  {     handler:  rootHandler,  validate:  {      query:  {          id:  Joi.number()  }  }   } });

Slide 26

Slide 26 text

server.route({   method:  'GET',   path:  '/user',   config:  {     handler:  rootHandler,  validate:  {      query:  {          id:  Joi.number().min(100).required()  }  }   } });

Slide 27

Slide 27 text

server.route({   method:  'GET',   path:  '/user',   config:  {     handler:  rootHandler,  validate:  {      query:  {          id:  Joi.number().min(100).required(),          username:  Joi.string().alphanum().min(3).max(20)  }  }   } });

Slide 28

Slide 28 text

server.route({   method:  'GET',   path:  '/user',   config:  {     handler:  rootHandler,  validate:  {      query:  {          id:  Joi.number().min(100).required().xor(‘username’),          username:  Joi.string().alphanum().min(3).max(20)  }  }   } });

Slide 29

Slide 29 text

hapi.js is configuration-centric easy to learn.

Slide 30

Slide 30 text

persistence

Slide 31

Slide 31 text

what is mongoDB ?

Slide 32

Slide 32 text

MongoDB (from "humongous") is a scalable, high- performance, open source NoSQL database. - mongodb.org

Slide 33

Slide 33 text

records are stored known as ‘documents’ and resemble json {   "source"  :  "127.0.0.1",   "action"  :  "testAction",   "category"  :  "testCategory",   "_id"  :  ObjectId("532deb3d1d4b597d8bfbd270"),   "dateCreated"  :  ISODate("2014-­‐03-­‐22T19:57:49.062Z"), }

Slide 34

Slide 34 text

hapi nodejs mongoose mongodb

Slide 35

Slide 35 text

var mongoose = require('mongoose'); var db = mongoose.createConnection('localhost', 'felkerlytics'); var schema = mongoose.Schema({ action: 'string', category: 'string' }); // ... etc var AnalyticEvent = db.model('analytic_event', schema); var analyticEvent = new AnalyticEvent({ action: 'linkClick' }); analyticEvent.save(function (err) { if (err) // ... reply(Boom.wrap(err)); }); mongoose mongoosejs.com

Slide 36

Slide 36 text

the analytic event model var  Mongoose      =  require('mongoose'); var  Schema          =  Mongoose.Schema; //  The  data  schema  for  an  event  that  we're  tracking  in  our  analytics  engine var  analyticEventSchema  =  new  Schema({    category            :  {  type:  String,  required:  true,  trim:  true  },    action                :  {  type:  String,  required:  true,  trim:  true  },    label                  :  {  type:  String,  trim:  true  },    source                :  {  type:  String,  required:  true,trim:  true    },              dateCreated      :  {  type:  Date,      required:  true,  default:  Date.now  } }); var  analyticEvent  =  Mongoose.model('analytic_event',  analyticEventSchema); module.exports  =  {    AnalyticEvent:  analyticEvent }; /models/analyticEvent.js

Slide 37

Slide 37 text

the analytic event model var  Mongoose      =  require('mongoose'); var  Schema          =  Mongoose.Schema; //  The  data  schema  for  an  event  that  we're  tracking  in  our  analytics  engine var  analyticEventSchema  =  new  Schema({    category            :  {  type:  String,  required:  true,  trim:  true  },    action                :  {  type:  String,  required:  true,  trim:  true  },    label                  :  {  type:  String,  trim:  true  },    source                :  {  type:  String,  required:  true,trim:  true    },    dateCreated      :  {  type:  Date,      required:  true,  default:  Date.now  } }); var  analyticEvent  =  Mongoose.model('analytic_event',  analyticEventSchema); module.exports  =  {    AnalyticEvent:  analyticEvent }; /models/analyticEvent.js

Slide 38

Slide 38 text

the analytic event model var  Mongoose      =  require('mongoose'); var  Schema          =  Mongoose.Schema; //  The  data  schema  for  an  event  that  we're  tracking  in  our  analytics  engine var  analyticEventSchema  =  new  Schema({    category            :  {  type:  String,  required:  true,  trim:  true  },    action                :  {  type:  String,  required:  true,  trim:  true  },    label                  :  {  type:  String,  trim:  true  },    source                :  {  type:  String,  required:  true,trim:  true    },                  dateCreated      :  {  type:  Date,      required:  true,  default:  Date.now  } }); var  analyticEvent  =  Mongoose.model('analytic_event',  analyticEventSchema); module.exports  =  {    AnalyticEvent:  analyticEvent }; /models/analyticEvent.js

Slide 39

Slide 39 text

the analytic event model var  Mongoose      =  require('mongoose'); var  Schema          =  Mongoose.Schema; //  The  data  schema  for  an  event  that  we're  tracking  in  our  analytics  engine var  analyticEventSchema  =  new  Schema({    category            :  {  type:  String,  required:  true,  trim:  true  },    action                :  {  type:  String,  required:  true,  trim:  true  },    label                  :  {  type:  String,  trim:  true  },    source                :  {  type:  String,  required:  true,trim:  true    },\    dateCreated      :  {  type:  Date,      required:  true,  default:  Date.now  } }); var  analyticEvent  =  Mongoose.model('analytic_event',  analyticEventSchema); module.exports  =  {    AnalyticEvent:  analyticEvent }; /models/analyticEvent.js

Slide 40

Slide 40 text

building the web api

Slide 41

Slide 41 text

new hapi project mkdir felkerlytics; cd felkerlytics { "name": "analytics-engine", "version": "0.0.1", "description": "An example hapi and mongo db app", "main": "server.js", "dependencies": { "hapi": "3.0.1", "mongoose": "~3.8.7", "boom": "^2.2.2", "lodash": "^2.4.1", "joi": "^2.8.0" } } create a package.json file with these contents create a folder for the app $ npm install install dependencies and install express

Slide 43

Slide 43 text

authentication basic passport.js hawk / oz

Slide 44

Slide 44 text

ok stop - code time

Slide 45

Slide 45 text

learn js the right way

Slide 46

Slide 46 text

github.com/donnfelker/ @donnfelker code twitter MongoHub