NODE.JS
INTRODUCTION
WHAT IS NODE.JS ? Node.JS is the Javascript engine of Chrome, port to be used from the command line.
ABOUT NODE.JS Created by Ryan Dahl in 2009 Licence MIT Based on Google Chrome V8 Engine
BASICS
ARCHITECTURE Single Threaded Event Loop Non‐blocking I/O Javascript (Event Driven Language)
NODE.JS SYSTEM
HELLO WORLD IN NODE.JS hello.js console.log('HelloWorld!'); $nodehello.js >HelloWorld!
DON'T FORGET THE DEMO.DON'T FORGET THE DEMO.
MODULES / LOAD Load a core module or a packaged module (in node_modules directory) varhttp=require('http'); Load from your project varmymodule=require('./mymodule');
MODULES / CREATE speaker.js module.exports={ sayHi:sayHi } functionsayHi(){console.log('hi!');} example.js varspeaker=require('./speaker'); speaker.sayHi();
YOU PREPARE A DEMO,YOU PREPARE A DEMO, DON'T U ?DON'T U ?
ERROR-FIRST CALLBACKS The first argument of the callback is always reserved for an error object: fs.readFile('/foo.txt',function(err,data){ if(err){ console.log('Ahh!AnError!'); return; } console.log(data); });
EXPRESS FRAMEWORK
WHAT IS IT ? "Fast, unopinionated, minimalist web framework for Node.js" (expressjs.com)
HELLO WORLD IN EXPRESS varexpress=require('express'); varapp=express(); app.get('/',function(req,res){ res.send('HelloWorld!'); }); app.listen(9001); Don’t forget: $npminstallexpress
LIVE DEMO ?LIVE DEMO ?
MIDDLEWARE / WHAT ? Middlewares can : make changes to the request and the response objects end the request
MIDDLEWARE / PIPE Middlewares are in a pipe varbodyParser=require('body-parser'); varcookieParser=require('cookie-parser'); varerrorHandler=require('errorhandler'), varapp=express(); app.use(bodyParser.json()); app.use(cookieParser()); app.use(errorHandler());
MIDDLEWARE / STANDARD MODULES body‐parser Parse request body and populate req.body cookie‐parser Parse cookie header and populate req.cookies cors Allow CORS requests errorhandler Send a full stack trace of error to the client. Has to be last express.static Serve static content from the "public" directory (html, css, js, etc.) method‐override Lets you use PUT and DELETE where the client doesn't support it
ROUTER / HELLO WORLD api‐hello.js varexpress=require('express'); varrouter=express.Router(); router.get('/',function(req,res){ res.send('HelloWorld!'); }); module.exports=router; index.js varexpress=require('express'); varapp=express(); //Routes app.use('/hello',require('./api-hello')); app.listen(9001);
CHOOSE THE DEMO PILL !CHOOSE THE DEMO PILL !
ROUTER / WHY ? Routers help to split the code in modules
MONGOOSE
WHAT IS IT ? Mongoose is a Node.js connector for MongoDB.
CONNECT TO MONGODB varmongoose=require('mongoose'); mongoose.connect('mongodb://localhost/test');
SCHEMA Define the format of a document with a schema : varStudentSchema=newmongoose.Schema({ name:String, age:Number course:[String], address:{ city:String, country:String } }); varStudent=mongoose.model('Student',StudentSchema);
CREATE OR UPDATE ITEM varstudent=newStudent({ name:'Serge', age:23, course:['AngularJS','Node.js'], address:{ city:'Paris', country:'France' } }); student.save(function(err){ if(err)returnconsole.log('notsaved!'); console.log('saved'); });
REMOVE ITEM student.remove(function(err){ if(err)returnconsole.log('notremoved!'); console.log('removed'); });
FIND ITEMS Student.findOne({name:'Serge'},function(err,student){ //studentisanStudentobject });
MEAN STACK
WHAT IS IT ? MEAN stands for : MongoDB Express framework AngularJS NodeJS
PROJECT STRUCTURE root |-api :allroutesandprocessing |-thing.js :anrouteexample |-node_modules :externallibrairies |-index.js :configurationandmainapplication |-package.json :listofexternallibrairies
INDEX.JS 4 parts : 1.  Connect to the Database 2.  Configure Express framework 3.  Define routes 4.  Start the server
HE HAS PROMISED USHE HAS PROMISED US AN EXAMPLE, RIGHT?AN EXAMPLE, RIGHT?
ROUTE EXAMPLE 1.  Define routes 2.  Define model 3.  Define processing
DID HE FORGETDID HE FORGET THE EXAMPLE ?THE EXAMPLE ?
TEST YOUR API !
POSTMAN Use Postman extension for Chrome (packaged app)
GO FURTHER NodeSchool.io (learn you node)
TUTORIAL
TUTORIAL / GET THE PROJECT GET THE PROJECT $gitclonehttps://github.com/fabienvauchelles/stweb-angularjs-tutorial.git $cdstweb-angularjs-tutorial/backend
TUTORIAL / SERVER GET THE NEXT STEP $gitreset--hardq15 $npminstall CREATE A SERVER Fill backend/app.js
TUTORIAL / FIRST ROUTE GET THE NEXT STEP $gitreset--hardq16 CREATE THE 'FINDALL' ROUTE 1.  Create a findAll function (node format) to return a list of article 2.  Add findAll to the router 3.  Add the articles route to backend/app.js
TUTORIAL / ROUTE 'CREATE' GET THE NEXT STEP $gitreset--hardq17 CREATE THE 'CREATE' ROUTE 1.  Create a create function (node format) to create an article from req.body 2.  Add create to the router (HTTP POST)
TUTORIAL / ROUTE 'DELETE' GET THE NEXT STEP $gitreset--hardq18 CREATE THE 'DELETE' ROUTE 1.  Create a destroy function (node format) to remove an article (id in the url) 2.  Add destroy to the router (HTTP DELETE)
TUTORIAL / IMPORT DATA START MONGODB In a new shell : $mongod
TUTORIAL / MONGOOSE GET THE NEXT STEP $gitreset--hardq19 IMPORT DATA $mongoimport--dbpostagram--collectionarticles --filearticles-init.json ADD MONGOOSE TO THE PROJECT $npminstallmongoose--save
TUTORIAL / CONNECT GET THE NEXT STEP $gitreset--hardq20 CONNECT SERVER TO MONGODB Add connect in backend/app.js
TUTORIAL / FINDALL GET THE NEXT STEP $gitreset--hardq21 USE MONGOOSE FOR FINDALL 1.  Comment create & destroy route (and function) 2.  Import mongoose with require 3.  Replace article static model with a mongoose schema 4.  Use mongoose to implement findAll
TUTORIAL / SEARCH GET THE NEXT STEP $gitreset--hardq22 REPLACE FINDALL BY SEARCH Use a MongoDB filter to search on title. Bonus: filter on description and tags
TUTORIAL / ROUTE 'CREATE' GET THE NEXT STEP $gitreset--hardq23 IMPLEMENT CREATE 1.  Use mongoose to implement create 2.  Uncomment the create route
TUTORIAL / ROUTE 'DELETE' GET THE NEXT STEP $gitreset--hardq24 IMPLEMENT DELETE 1.  Use mongoose to implement delete 2.  Uncomment the delete route
© Fabien Vauchelles (2015) TUTORIAL / FINAL GET AND READ THE SOLUCE $gitreset--hardq25

Use Node.js to create a REST API