workshop 4: nodejs. express framework & mongodb

32
Node.js, Express & MongoDB A brief introduction Cristina Hernández & Alberto Irurueta

Upload: visual-engineering

Post on 16-Apr-2017

522 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Workshop 4: NodeJS. Express Framework & MongoDB

Node.js, Express & MongoDBA brief introduction

Cristina Hernández &

Alberto Irurueta

Page 2: Workshop 4: NodeJS. Express Framework & MongoDB

What is Node.js?

- Is an implementation of a web server based on Javascript

- Is not a web framework, it’s a platform! (It’s like saying that .net is a web development framework)

Page 3: Workshop 4: NodeJS. Express Framework & MongoDB

Pros & Cons of Node.js

PROS:- Is very very efficient in

resources usage. - Javascript code is compiled.

- Runs on a single thread.- WTF?- Takes advantage of I/O locks to

handle several requests almost concurrently on a single thread.

- Useful for I/O, not for intensive computations

- On production systems typically one thread is spanned per processor

- Javascript both on frontend & backend

- Easier for designers

CONS:- Configuration on

Windows systems is a pain in the ass.

- Not useful for computation intensive tasks or enterprise applications.

http://blog.mixu.net/2011/02/01/understanding-

the-node-js-event-loop/

Page 4: Workshop 4: NodeJS. Express Framework & MongoDB

Runs on a single thread I

- All I/O call are non-blocking and event based

- Your code is the only part not running asynchronously, hence computation intensive code (i.e. computing an image thumbnail) blocks the whole server.

- Asynchronous code can be made using solutions similar to WebSockets, but then thread synchronization issues will appear.

It is typically better to run computationally intensive code in backend servers and use an API REST or similar.

Page 5: Workshop 4: NodeJS. Express Framework & MongoDB

Runs on a single thread II

- But how can we attend several requests on a single thread?

- A bit of history:- One process per request:

- process memory is copied for each request. Too much memory usage!

- One thread per request: - typically using POSIX accept(). Memory does not need to be copied but the OS has

additional work scheduling all the threads.

- Single asynchronous thread: - using select() multiple requests can be attended while waiting for other I/O operations

on other requests on the same thread! Less work for the OS!

POSIX accept: http://pubs.opengroup.org/onlinepubs/009695399/functions/accept.htm

POSIX select: http://linux.die.net/man/2/selectl

Page 6: Workshop 4: NodeJS. Express Framework & MongoDB

Node.js event based

var result = db.query("select x from table_Y");

doSomethingWith(result); //wait for result

doSomethingWithOutResult(); //execution is blocked!!

Sync:

Async:

db.query(“select x from table_Y”, function (result) {

doSomethingWith(result); //wait for result

});

doSomethingWithOutResult(); //executes without any delay!

callback!

Page 7: Workshop 4: NodeJS. Express Framework & MongoDB

Node.js comparison

- Asynchronous thread handling is not exclusive of node.js!- It is interesting for AJAX intensive applications or for

push model implementations (i.e. websockets, chats, etc)

- Other platforms have implemented this model too:- Java: Servlet API 3.0 (December 2009)

- ASP.NET: .NET platform 4.5 (August 2012)- PHP? Django?

Page 8: Workshop 4: NodeJS. Express Framework & MongoDB

Node.js installation

Mac OS X:- Go to: https://nodejs.org/en/- Click the big green button to download the setup

program.

Linux:sudo apt-get updatesudo apt-get install nodejssudo apt-get install npm

Page 9: Workshop 4: NodeJS. Express Framework & MongoDB

Running & debugging

- Starting/stopping: node <file.js>

- Debugging: nodemon --debug <file.js>

- Debugger: node-inspector

Installing nodemon && node-inspector:npm install nodemonnpm install node-inspector

Page 10: Workshop 4: NodeJS. Express Framework & MongoDB

Node.js - when to use it

- Chat / Messaging

- Real-Time applications

- High concurrency applications

http://stackoverflow.com/questions/5062614/how-to-decide-when-to-use-node-js

Page 11: Workshop 4: NodeJS. Express Framework & MongoDB

Node.js - Built-in modules

- assert- buffer- child_process- cluster- crypto- dgram- dns- events- fs- http- https- net

- os- path- punycode- querystring- readline- repl- string_decoder- tls- tty- url- util- vm- zlib

Page 12: Workshop 4: NodeJS. Express Framework & MongoDB

Node.js - FileSystem

var fs = require("fs");

// Asynchronous read

fs.readFile('input.txt', function (err, data) {

if (err) {

return console.error(err);

}

console.log("Asynchronous read: " + data.toString());

});

// Synchronous read

var data = fs.readFileSync('input.txt');

console.log("Synchronous read: " + data.toString());

console.log("Program Ended");

Page 13: Workshop 4: NodeJS. Express Framework & MongoDB

What is Express?

It is a node.js based web framework

It’s the equivalent to a Servlet + web.xml in Java!

npm install --save express

Page 14: Workshop 4: NodeJS. Express Framework & MongoDB

Express - HTTP Server

var express = require('express');

var http = require('http');

//create express app

var app = express();

app.set('port', process.env.PORT || 3000);

http.createServer(app).listen(app.get('port'), function(){

console.log('Express server listening on port ' + app.get('port'));

});

Page 15: Workshop 4: NodeJS. Express Framework & MongoDB

Express - Routing

app.get('/', function(request, response) {

response.send('¡Hello, Express!');

});

app.get('/users/:userName', function(request, response) {

var name = request.params.userName;

response.send('¡Hello, ' + name + '!');

});

//regex

app.get(/\/users\/(\d*)\/?(edit)?/, function (request, response) {

var message = 'user number #' + request.params[0];

if (request.params[1] === 'edit') {

message = Editing ' + message;

} else {

message = 'Viewing ' + message;

}

response.send(message);

});

handler

Page 16: Workshop 4: NodeJS. Express Framework & MongoDB

Express - Routing POST

app.post('/users', function(request, response) {

var username = request.body.username;

response.send('¡Hello, ' + username + '!');

});

Express doesn’t parse request body by default

app.use(express.bodyParser());

middleware

Page 17: Workshop 4: NodeJS. Express Framework & MongoDB

Express - View rendering

app.set('views', path.join(__dirname, '..', '..', 'templates'));

app.set('view engine', 'dust');

app.get('/', function(request, response) {

response.render('index', {

title: '¡Hello, Express!',

username: 'Benítez'

});

});

view parameters

Page 18: Workshop 4: NodeJS. Express Framework & MongoDB

Express - NODE_ENV

Linux and OSX: export NODE_ENV=production

Windows: SET NODE_ENV=production

- Environment variable NODE_ENV

- development

- production

- By default, Express switches on view caching on production

Page 19: Workshop 4: NodeJS. Express Framework & MongoDB

Express - Connect / Middlewares

function uselessMiddleware(req, res, next) { next() }

// A middleware that simply interrupts every request

function worseThanUselessMiddleware(req, res, next) {

next("Hey are you busy?")

}

- Connect is an extensible HTTP server framework for node, providing high performance "plugins" known as middleware.

- A middleware is simply a function with three arguments: request, response, next

error -> request interruption

Page 20: Workshop 4: NodeJS. Express Framework & MongoDB

Express - Connect / Middlewares

// a middleware mounted on /user/:id; will be executed for any type of HTTP

request to /user/:id

app.use('/user/:id', function (req, res, next) {

console.log('Request Type:', req.method);

next();

})

// a middleware with no mount path; gets executed for every request to the app

app.use(function (req, res, next) {

console.log('Time:', Date.now());

next();

});

Page 21: Workshop 4: NodeJS. Express Framework & MongoDB

Express - Router-level middleware

var app = express();

var router = express.Router();

// shows request info for any type of HTTP request to /user/:id

router.use('/user/:id', function(req, res, next) {

console.log('Request URL:', req.originalUrl);

next();

}, function (req, res, next) {

console.log('Request Type:', req.method);

next();

});

// mount the router on the app

app.use('/', router);

Page 22: Workshop 4: NodeJS. Express Framework & MongoDB

Express - Error Handling

app.use(function(err, req, res, next) {

console.error(err.stack);

res.status(500).send('Something broke!');

});

- Error-handling middleware always takes fourarguments.

Page 23: Workshop 4: NodeJS. Express Framework & MongoDB

Express - Official middlewares

Page 24: Workshop 4: NodeJS. Express Framework & MongoDB

MongoDB

It’s a non relational databaseIt’s non-transactional: Only guarantees that read/write operations are atomic, but rollback cannot be doneBetter performance than most relational databasesNot suitable for highly concurrent applications (i.e. commerce or financial applications where account balances or product stock must be synchronized between requests).Suitable to work on non-concurrent and large amounts of data (i.e. timeline, logging, analytics, etc)Uses Javascript as programming language!MongooseOther relational & non-relational databases

Page 25: Workshop 4: NodeJS. Express Framework & MongoDB

MongoDB - NoSQL Database

NoSQL Database - Not Only SQL Database

Many different types: - key-value stores

- document databases

- wide-column stores

- graph databases

Page 26: Workshop 4: NodeJS. Express Framework & MongoDB

MongoDB - SQL vs NoSQL

SQL Databases

- Individual records stored as rows in tables

- Structure and data types fixed in advance

- Transactional- Consistent

NoSQL Databases

- Document: table-and-row model stored in single document

- Dynamic structure- Atomic operations- Not all, MongoDB is

consistent

Page 27: Workshop 4: NodeJS. Express Framework & MongoDB

MongoDB - setup

It’s a node package:

Start database (from cmd):

npm install mongodb

https://www.mongodb.org/

mongod //service

mongo

default port is 27017

Page 28: Workshop 4: NodeJS. Express Framework & MongoDB

MongoDB - structure

Database

Collection Collection Collection

Document Document

SQL

Database

Database

Table

Row

Page 29: Workshop 4: NodeJS. Express Framework & MongoDB

MongoDB

var Mongo = require(“mongodb”).MongoClient;

//connect to ‘test’, if not exists, create itMongo.connect(“mongodb://localhost:27017/test”, function(err, db){

if(!err){ //We are connectedvar collection = db.collection(‘users’);//insert into collection, if not exists, create itcollection.insert({name:’Lionel’, apellidos:’Messi’}, function(err,

collection){});collection.update({apellidos:’Messi’}, {$set:{name:’D10S’}});collection.remove({apellidos:’Messi’});

}});

Page 30: Workshop 4: NodeJS. Express Framework & MongoDB

MongoDB

var stream = db.find({apellidos:’Messi’}).stream();

stream.on(“data”, function(item){//fired on each result found

});

stream.on(“end”, function() {//fired when there is no more document to look for

});

Page 31: Workshop 4: NodeJS. Express Framework & MongoDB
Page 32: Workshop 4: NodeJS. Express Framework & MongoDB