SlideShare a Scribd company logo
Building a real-life
application in Node JS
       Darren Waddell
ME ME ME ME ME

     • MooTools Developer
     • Love JavaScript!
     • C# Developer
     • Love building big apps!
OMG
JAVASCRIPT
SERVER!
‘Real-life applications’

• Websites
• Content Management Systems
• Blog Engines
• (Not games, chat programs, ‘Native HTML5’
  fish demos)
I’LL BUILD
A CMS!
What did I need to
      start

   • OSX! (or linux)
   • Install Node and NPM
   • A DB (MongoDB)
Confusing things!

• Non-blocking, event driven, asynchronous
• NoSQL
• Modules and NPM
• No Firebug!
Things I need for my
          app

• Routing
• Database
• Templating
Express
                  Setting up server




var app = require('express').createServer();

app.get('/', function(req, res){
  res.send('hello world');
});

app.listen(80);
Express
              Setting up View handler



app.set('view engine', 'jade');
app.set('views', __dirname + '/views');

app.get('/foo/bar', function(req, res){
  res.render('foo/bar');
  // calls /views/foo/bar.jade
});

app.listen(80);
Express
              Setting up ‘static assets’

var app = require('express').createServer();

app.use(
    express.static(__dirname + '/public')
);

<script type=”foo.js”></script>
// is at http://foo.com/foo.js
// NOT http://foo.com/public/foo.js
Express
             Passing data to views



app.get('/foo/bar', function(req, res){
  res.render('foo/bar', {
    locals: {
      foo: ‘bar’
    }
  });
});
Express
             Passing data to views




app.get('/users/:id', function(req, res){
    // req.params contains
    // the querystring values
    var id = req.params.id;
});
Express
              Passing data to views



app.use(express.bodyParser());

app.post('/users/:id', function(req, res){
    // req.body contains the postback
    var username = req.body.name;
});
Express
                ‘Master Pages’




app.set('view options', {
    layout: 'shared/layout'
});

app.get('/foo/bar', function(req, res){
    res.render('foo/bar');
});
Things I need for my
          app

• Routing
• Database
• Templating
Mongo DB
• No tables! ‘Collections’
• No Rows! ‘Documents’
• No columns! ‘Fields’
• JSON format!
• No SQL joins!
• Flexible table collection structure
Mongo DB


select * from ‘foo’

 db.foo.find({});
Mongo DB
insert into ‘foo’
set (‘foobar’)
values (‘whatever’);


db.foo.insert({
   ‘foobar’: ‘whatever’
});
Mongo DB

delete from ‘foo’
where ‘name’ = ‘Darren’



db.foo.remove({
    ‘name’:‘Darren’
});
Mongoose

• Models
• Getters and Setters, Defaults,Validators
• Avoid callback soup (very important!)
Mongoose
                           Simple modelling

var mongoose = require(‘mongoose’);
mongoose.connect(‘mongodb://localhost/myDB’);

var User = new mongoose.Schema({

 username: String,

 fullname: String,
   password: String
});

var myUserModel = mongoose.model(‘User’);

myUserModel.find({}, function(err, docs){
   docs.forEach(function(user){
      // do stuff
   });
});
Mongoose
                           Simple modelling


var mongoose = require(‘mongoose’);
mongoose.connect(‘mongodb://localhost/myDB’);

var User = new mongoose.Schema({

 username: String,

 fullname: String,

 password: String
});

var myUserModel = mongoose.model(‘User’);

myUserModel.username = ‘fakedarren’;
myUserModel.fullname = ‘William Waddell’;

myUserModel.save();
Mongoose
                  Simple modelling




var myUserModel = mongoose.model(‘User’);

myUserModel.username = ‘fakedarren’;
myUserModel.fullname = ‘William Waddell’;

myUserModel.save();
MongooseDefault values




var mongoose = require(‘mongoose’);
mongoose.connect(‘mongodb://localhost/myDB’);

var User = new mongoose.Schema({

 username: String,

 fullname: String,

 password: String,

 role: {

 
 type: String,

 
 default: ‘Admin’

 }
});
Mongoose
                          Getters and Setters


var mongoose = require(‘mongoose’);
mongoose.connect(‘mongodb://localhost/myDB’);

var User = new mongoose.Schema({

 username: String,

 fullname: String,

 password: String
});

User.path(‘password’).set(function(value){

 if (password.length < 8){

 
 return new Error(‘Password must be more than 8 characters’);

 } else {

 
 return value;

 }
});
Mongoose
                  Middleware / promises / whatever it’s called


User.pre(‘save’, function(next){

 // do something

 next();
});
User.pre(‘save’, function(next){

 // do something else

 next();
});

var myUserModel = mongoose.model(‘User’);

myUserModel.username = ‘fakedarren’;
myUserModel.fullname = ‘William Waddell’;

myUserModel.save();
Things I need for my
          app

• Routing
• Database
• Templating
View Engines

       HAML
         Jade
          EJS
      CoffeeKup
   jQuery Templates
View Engines

       HAML
         Jade
          EJS
      CoffeeKup
   jQuery Templates
Jade
http://jade-lang.com/


!!! 5
html(lang="en")
  head
    title= pageTitle
    script(type='text/javascript')
       if (foo) {
          bar()
       }
  body
    h1 Jade - node template engine
    #container
       - if (youAreUsingJade)
         p You are amazing
       - else
         p Get on it!
!!! 5
html(lang="en")
  head
    title= pageTitle
    script(type='text/javascript')
       if (foo) {
          bar()
       }
  body
    h1 Jade - node template engine
    #container
       - if (youAreUsingJade)
         p You are amazing
       - else
         p Get on it!
EJS
https://github.com/visionmedia/ejs


       <!DOCTYPE html>
       <html>
       <head>
       <title>Awesome</title>
       </head>
       <body>
       <% if (names.length) { %>
       <ul>
           <% names.forEach(function(name){ %>
             <li><%= name %></li>
           <% }) %>
         </ul>
       <% } %>
       </body>
       </html>
<!DOCTYPE html>
<html>
<head>
<title>Awesome</title>
</head>
<body>
<% if (names.length) { %>
<ul>
    <% names.forEach(function(name){ %>
      <li><%= name %></li>
    <% }) %>
  </ul>
<% } %>
</body>
</html>
Things I need for my
          app

• Routing
• Database
• Templating
Things I need for my
           app
• Routing
• Database
• Templating
• And a million other things....
Thanks!
            @fakedarren

https://github.com/fakedarren/node-cms

More Related Content

What's hot (20)

PPTX
Java script at backend nodejs
Amit Thakkar
 
PDF
Express node js
Yashprit Singh
 
KEY
node.js: Javascript's in your backend
David Padbury
 
PPTX
Express js
Manav Prasad
 
PDF
Non-blocking I/O, Event loops and node.js
Marcus Frödin
 
PPT
Node js presentation
martincabrera
 
PDF
All aboard the NodeJS Express
David Boyer
 
PDF
Nodejs Explained with Examples
Gabriele Lana
 
PPTX
Node.js Patterns for Discerning Developers
cacois
 
KEY
Node.js - Best practices
Felix Geisendörfer
 
PDF
Node.js
Jan Dillmann
 
PDF
Node.js and How JavaScript is Changing Server Programming
Tom Croucher
 
PPTX
Introduction to node.js GDD
Sudar Muthu
 
KEY
Introduction to node.js
jacekbecela
 
PPTX
Intro to Node.js (v1)
Chris Cowan
 
PDF
Node ppt
Tamil Selvan R S
 
PDF
Use Node.js to create a REST API
Fabien Vauchelles
 
PDF
Original slides from Ryan Dahl's NodeJs intro talk
Aarti Parikh
 
KEY
A language for the Internet: Why JavaScript and Node.js is right for Internet...
Tom Croucher
 
PDF
NodeJS for Beginner
Apaichon Punopas
 
Java script at backend nodejs
Amit Thakkar
 
Express node js
Yashprit Singh
 
node.js: Javascript's in your backend
David Padbury
 
Express js
Manav Prasad
 
Non-blocking I/O, Event loops and node.js
Marcus Frödin
 
Node js presentation
martincabrera
 
All aboard the NodeJS Express
David Boyer
 
Nodejs Explained with Examples
Gabriele Lana
 
Node.js Patterns for Discerning Developers
cacois
 
Node.js - Best practices
Felix Geisendörfer
 
Node.js
Jan Dillmann
 
Node.js and How JavaScript is Changing Server Programming
Tom Croucher
 
Introduction to node.js GDD
Sudar Muthu
 
Introduction to node.js
jacekbecela
 
Intro to Node.js (v1)
Chris Cowan
 
Use Node.js to create a REST API
Fabien Vauchelles
 
Original slides from Ryan Dahl's NodeJs intro talk
Aarti Parikh
 
A language for the Internet: Why JavaScript and Node.js is right for Internet...
Tom Croucher
 
NodeJS for Beginner
Apaichon Punopas
 

Viewers also liked (20)

KEY
Getting Started with MongoDB and Node.js
Grant Goodale
 
PDF
Node.js and Ruby
Michael Bleigh
 
PDF
It is not supposed to fly but it does
Gabriele Lana
 
PDF
Anatomy of a Modern Node.js Application Architecture
AppDynamics
 
PDF
Node Foundation Membership Overview 20160907
NodejsFoundation
 
PPTX
Introduction to Node.js
Vikash Singh
 
PPTX
S2 b desenvolvimento de sistemas [reparado]
Milena Rebouças
 
PPTX
Node.js - un poco de informacion.
Luis Toscano
 
PDF
Node.js - A Quick Tour II
Felix Geisendörfer
 
PDF
Running Node.js in Production using Passenger
davidchubbs
 
PDF
Node in Production at Aviary
Aviary
 
PPTX
Node JS (Francisco Cerdas)
PiXeL16
 
PDF
Membangun Website Lowongan Kerja Sederhana dengan NodeJS
Ridwan Fadjar
 
PDF
Introducción a Node.js
José Ignacio Fernández
 
PDF
Beyond Phoenix
Gabriele Lana
 
PDF
Webinar: Developing with the modern App Stack: MEAN and MERN (with Angular2 a...
MongoDB
 
PDF
Nodifying the Enterprise - Prince Soni, TO THE NEW
NodejsFoundation
 
PPTX
Connecting NodeJS & MongoDB
Enoch Joshua
 
PPTX
Node JS Express : Steps to Create Restful Web App
Edureka!
 
Getting Started with MongoDB and Node.js
Grant Goodale
 
Node.js and Ruby
Michael Bleigh
 
It is not supposed to fly but it does
Gabriele Lana
 
Anatomy of a Modern Node.js Application Architecture
AppDynamics
 
Node Foundation Membership Overview 20160907
NodejsFoundation
 
Introduction to Node.js
Vikash Singh
 
S2 b desenvolvimento de sistemas [reparado]
Milena Rebouças
 
Node.js - un poco de informacion.
Luis Toscano
 
Node.js - A Quick Tour II
Felix Geisendörfer
 
Running Node.js in Production using Passenger
davidchubbs
 
Node in Production at Aviary
Aviary
 
Node JS (Francisco Cerdas)
PiXeL16
 
Membangun Website Lowongan Kerja Sederhana dengan NodeJS
Ridwan Fadjar
 
Introducción a Node.js
José Ignacio Fernández
 
Beyond Phoenix
Gabriele Lana
 
Webinar: Developing with the modern App Stack: MEAN and MERN (with Angular2 a...
MongoDB
 
Nodifying the Enterprise - Prince Soni, TO THE NEW
NodejsFoundation
 
Connecting NodeJS & MongoDB
Enoch Joshua
 
Node JS Express : Steps to Create Restful Web App
Edureka!
 
Ad

Similar to Building a real life application in node js (20)

PPTX
Introduction to node.js
Adrien Guéret
 
PDF
Basic API Creation with Node.JS
Azilen Technologies Pvt. Ltd.
 
PPTX
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and Express
Charlie Key
 
PDF
Backbonetutorials
shekhar_who
 
PPTX
Local SQLite Database with Node for beginners
Laurence Svekis ✔
 
PPTX
Building Web Apps with Express
Aaron Stannard
 
PPTX
Zero to Hipster with the M.I.K.E. Stack
Jen Looper
 
PDF
GDG-USAR Tech winter break 2024 USAR.pdf
raiaryan174
 
PPT
nodejs tutorial foor free download from academia
rani marri
 
KEY
20120306 dublin js
Richard Rodger
 
PPTX
Node js crash course session 5
Abdul Rahman Masri Attal
 
PPTX
Introduction to Node.js
Winston Hsieh
 
PDF
What is Node.js? (ICON UK)
Tim Davis
 
PDF
Download full ebook of Learning Node Shelley Powers instant download pdf
zeitsloyerqy
 
PDF
Web_Development_with_Node_Express.pdf
Marco Antonio Martinez Andrade
 
PPTX
Express JS
Alok Guha
 
PDF
Introduction to REST API with Node.js
Yoann Gotthilf
 
PDF
Backend Basic in nodejs express and mongodb PPT.pdf
sadityaraj353
 
PDF
Writing RESTful web services using Node.js
FDConf
 
PPTX
express.js.pptxgghhhhhhnnbvcdssazxvuyiknvc
rani marri
 
Introduction to node.js
Adrien Guéret
 
Basic API Creation with Node.JS
Azilen Technologies Pvt. Ltd.
 
MIKE Stack Introduction - MongoDB, io.js, KendoUI, and Express
Charlie Key
 
Backbonetutorials
shekhar_who
 
Local SQLite Database with Node for beginners
Laurence Svekis ✔
 
Building Web Apps with Express
Aaron Stannard
 
Zero to Hipster with the M.I.K.E. Stack
Jen Looper
 
GDG-USAR Tech winter break 2024 USAR.pdf
raiaryan174
 
nodejs tutorial foor free download from academia
rani marri
 
20120306 dublin js
Richard Rodger
 
Node js crash course session 5
Abdul Rahman Masri Attal
 
Introduction to Node.js
Winston Hsieh
 
What is Node.js? (ICON UK)
Tim Davis
 
Download full ebook of Learning Node Shelley Powers instant download pdf
zeitsloyerqy
 
Web_Development_with_Node_Express.pdf
Marco Antonio Martinez Andrade
 
Express JS
Alok Guha
 
Introduction to REST API with Node.js
Yoann Gotthilf
 
Backend Basic in nodejs express and mongodb PPT.pdf
sadityaraj353
 
Writing RESTful web services using Node.js
FDConf
 
express.js.pptxgghhhhhhnnbvcdssazxvuyiknvc
rani marri
 
Ad

Recently uploaded (20)

PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
PDF
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
PPTX
Digital Circuits, important subject in CS
contactparinay1
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
Digital Circuits, important subject in CS
contactparinay1
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 

Building a real life application in node js

  • 1. Building a real-life application in Node JS Darren Waddell
  • 2. ME ME ME ME ME • MooTools Developer • Love JavaScript! • C# Developer • Love building big apps!
  • 4. ‘Real-life applications’ • Websites • Content Management Systems • Blog Engines • (Not games, chat programs, ‘Native HTML5’ fish demos)
  • 6. What did I need to start • OSX! (or linux) • Install Node and NPM • A DB (MongoDB)
  • 7. Confusing things! • Non-blocking, event driven, asynchronous • NoSQL • Modules and NPM • No Firebug!
  • 8. Things I need for my app • Routing • Database • Templating
  • 9. Express Setting up server var app = require('express').createServer(); app.get('/', function(req, res){ res.send('hello world'); }); app.listen(80);
  • 10. Express Setting up View handler app.set('view engine', 'jade'); app.set('views', __dirname + '/views'); app.get('/foo/bar', function(req, res){ res.render('foo/bar'); // calls /views/foo/bar.jade }); app.listen(80);
  • 11. Express Setting up ‘static assets’ var app = require('express').createServer(); app.use( express.static(__dirname + '/public') ); <script type=”foo.js”></script> // is at http://foo.com/foo.js // NOT http://foo.com/public/foo.js
  • 12. Express Passing data to views app.get('/foo/bar', function(req, res){ res.render('foo/bar', { locals: { foo: ‘bar’ } }); });
  • 13. Express Passing data to views app.get('/users/:id', function(req, res){ // req.params contains // the querystring values var id = req.params.id; });
  • 14. Express Passing data to views app.use(express.bodyParser()); app.post('/users/:id', function(req, res){ // req.body contains the postback var username = req.body.name; });
  • 15. Express ‘Master Pages’ app.set('view options', { layout: 'shared/layout' }); app.get('/foo/bar', function(req, res){ res.render('foo/bar'); });
  • 16. Things I need for my app • Routing • Database • Templating
  • 17. Mongo DB • No tables! ‘Collections’ • No Rows! ‘Documents’ • No columns! ‘Fields’ • JSON format! • No SQL joins! • Flexible table collection structure
  • 18. Mongo DB select * from ‘foo’ db.foo.find({});
  • 19. Mongo DB insert into ‘foo’ set (‘foobar’) values (‘whatever’); db.foo.insert({ ‘foobar’: ‘whatever’ });
  • 20. Mongo DB delete from ‘foo’ where ‘name’ = ‘Darren’ db.foo.remove({ ‘name’:‘Darren’ });
  • 21. Mongoose • Models • Getters and Setters, Defaults,Validators • Avoid callback soup (very important!)
  • 22. Mongoose Simple modelling var mongoose = require(‘mongoose’); mongoose.connect(‘mongodb://localhost/myDB’); var User = new mongoose.Schema({ username: String, fullname: String, password: String }); var myUserModel = mongoose.model(‘User’); myUserModel.find({}, function(err, docs){ docs.forEach(function(user){ // do stuff }); });
  • 23. Mongoose Simple modelling var mongoose = require(‘mongoose’); mongoose.connect(‘mongodb://localhost/myDB’); var User = new mongoose.Schema({ username: String, fullname: String, password: String }); var myUserModel = mongoose.model(‘User’); myUserModel.username = ‘fakedarren’; myUserModel.fullname = ‘William Waddell’; myUserModel.save();
  • 24. Mongoose Simple modelling var myUserModel = mongoose.model(‘User’); myUserModel.username = ‘fakedarren’; myUserModel.fullname = ‘William Waddell’; myUserModel.save();
  • 25. MongooseDefault values var mongoose = require(‘mongoose’); mongoose.connect(‘mongodb://localhost/myDB’); var User = new mongoose.Schema({ username: String, fullname: String, password: String, role: { type: String, default: ‘Admin’ } });
  • 26. Mongoose Getters and Setters var mongoose = require(‘mongoose’); mongoose.connect(‘mongodb://localhost/myDB’); var User = new mongoose.Schema({ username: String, fullname: String, password: String }); User.path(‘password’).set(function(value){ if (password.length < 8){ return new Error(‘Password must be more than 8 characters’); } else { return value; } });
  • 27. Mongoose Middleware / promises / whatever it’s called User.pre(‘save’, function(next){ // do something next(); }); User.pre(‘save’, function(next){ // do something else next(); }); var myUserModel = mongoose.model(‘User’); myUserModel.username = ‘fakedarren’; myUserModel.fullname = ‘William Waddell’; myUserModel.save();
  • 28. Things I need for my app • Routing • Database • Templating
  • 29. View Engines HAML Jade EJS CoffeeKup jQuery Templates
  • 30. View Engines HAML Jade EJS CoffeeKup jQuery Templates
  • 31. Jade http://jade-lang.com/ !!! 5 html(lang="en") head title= pageTitle script(type='text/javascript') if (foo) { bar() } body h1 Jade - node template engine #container - if (youAreUsingJade) p You are amazing - else p Get on it!
  • 32. !!! 5 html(lang="en") head title= pageTitle script(type='text/javascript') if (foo) { bar() } body h1 Jade - node template engine #container - if (youAreUsingJade) p You are amazing - else p Get on it!
  • 33. EJS https://github.com/visionmedia/ejs <!DOCTYPE html> <html> <head> <title>Awesome</title> </head> <body> <% if (names.length) { %> <ul>     <% names.forEach(function(name){ %>       <li><%= name %></li>     <% }) %>   </ul> <% } %> </body> </html>
  • 34. <!DOCTYPE html> <html> <head> <title>Awesome</title> </head> <body> <% if (names.length) { %> <ul>     <% names.forEach(function(name){ %>       <li><%= name %></li>     <% }) %>   </ul> <% } %> </body> </html>
  • 35. Things I need for my app • Routing • Database • Templating
  • 36. Things I need for my app • Routing • Database • Templating • And a million other things....
  • 37. Thanks! @fakedarren https://github.com/fakedarren/node-cms

Editor's Notes