Techbar nodejs+mongodb+mongoose

56
TECHBAR Nodejs + MongoDB + Mongoose

Transcript of Techbar nodejs+mongodb+mongoose

TECHBARNodejs + MongoDB + Mongoose

Me (www.massimobiagioli.it)

[email protected] massimo.biagioli maxbiag80 +MassimoBiagioli massimo-biagioli/28/8b0/94 massimobiagioli

Stack

+ +

Nodejshttp://nodejs.org/

NodejsFramework che permette di usare V8, l'interprete JavaScript di Google anche per realizzare web application e applicazioni fortemente orientate al networking.

(fonte: html.it)

NodejsUn primo esempio

Clonare questo progetto da GitHub:https://github.com/massimobiagioli/techbar-node

Esaminare il file:techbar-getting-started-01.js

NodejsExpress (http://expressjs.com/)

npm install express --save

- Framework per la creazione di Web Application- Utilizzato per la realizzazione di API RESTful- Meccanismo d routing- Configurabile tramite middlewares

NodejsMiddlewares

body-parser (https://github.com/expressjs/body-parser)npm install body-parser --save

morgan (https://github.com/expressjs/morgan)npm install morgan --save

NodejsDichiarazione variabili

var express = require('express'),bodyParser = require('body-parser'),http = require('http'),morgan = require('morgan'),app = express(),router = express.Router();

NodejsConfigurazione app

app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: true }));app.use(morgan('combined'));

NodejsConfigurazione routes

router.get('/handshake', function(req, res) {res.json({ message: 'handshake ok' });

});app.use('/api', router);

NodejsCreazione server

http.createServer(app).listen(3000, 'localhost', function() {console.log("Express server listening on port " + 3000);

});

NodejsCollegandosi dal browser a questo indirizzo:http://localhost:3000/api/handshake

Avremo la seguente risposta:

{"message":"handshake ok"}

NodejsCreare un middleware

Esaminare il file:techbar-getting-started-02.js

NodejsDefinizione

var printUserAgent = function(req, res, next) {var userAgent = req.headers['user-agent'];

if (userAgent.indexOf('Mozilla') > -1) {console.log('Dovresti usare IE!!!');

}next();

};

NodejsUtilizzo

app.use(printUserAgent);

NodejsRouter

Elementi di una route:- Verb- Url- Callback

NodejsRouter >> Verb

- GET- POST- PUT- DELETE

NodejsRouter >> Url

- /api/hello- /api/hello/:name- /api/hello/:name(regex)

NodejsRouter >> Callback

function(req, res) {res.json({ message: 'hello ' + req.params.name });

}

NodejsCommonJs

http://wiki.commonjs.org/wiki/CommonJS

Esaminare il file:techbar-getting-started-03.js

NodejsDefinizione del modulo “example”

var sum = function(a, b) {return a + b;

};

module.exports = {sum: sum

};

NodejsUtilizzo del modulo “example”

var example = require('./lib/example');

console.log("Result: " + example.sum(3, 4));

Nodejs

npmjshttps://www.npmjs.com/

NodejsDipendenze: il file “package.json”…"dependencies": { "mongoose": "~3.8.21", "express": "~4.11.1", "http": "0.0.0", "cors": "~2.5.3", "body-parser": "~1.10.2", "morgan": "~1.5.1" }...

npm install

NodejsLe insidie...

NodejsInsidie >> La Piramide di Doom

Esempio:techbar-getting-started-04.js

Soluzione:techbar-getting-started-05.js

q

NodejsInsidie >> JavaScript Bad Parts

MongoDBhttp://www.mongodb.org/

MongoDBMongoDB è un database NoSQL di tipo document: questo vuol dire che è particolarmente orientato ad un approccio alla modellazione di tipo domain driven e ad un utilizzo “ad oggetti” delle entità.

(fonte: html.it)

MongoDBNon esiste il concetto di “Tabella” (elemento chiave dei RDBMS).

Esiste invece quello di “Collection”.

MongoDB

https://mongolab.com free plan

MongoDBUMongohttp://edgytech.com/umongo/

MongoDBUMongo >> Parametri di connessione

Mongoosehttp://mongoosejs.com/

MongooseE’ un modulo che consente di interfacciare NodeJs con MongoDb.

Si basa sul concetto di “Schema” per la rappresentazione delle collection di MongoDb.

MongooseOltre alle classiche operazioni “CRUD”, consente anche di effettuare la validazione dei modelli, in funzione delle regole definite nello Schema.

MongooseConnessione a MongoDb

Esempio:techbar-mongoose-connection.js

Mongoosevar express = require('express'),

bodyParser = require('body-parser'),http = require('http'),morgan = require('morgan'),mongoose = require('mongoose'),app = express(),db;

Mongoosemongoose.connect('mongodb://techbar:[email protected]:31601/techbar');db = mongoose.connection;db.on('error', console.error.bind(console, 'connection error: '));db.once('open', function() {

console.log("Connected to MongoDb");http.createServer(app).listen(3000, 'localhost', function() {

console.log("Express server listening on port " + 3000);});

});

MongooseSchema: definizione della struttura della collection

var EventSchema = new mongoose.Schema({title: {type: String, required: true},speaker: {type: String, required: true},where: {type: String, required: true},….

}, {collection: 'events'

});

MongooseModel: definizione oggeto basato su uno schema

var Event = mongoose.model('Event', EventSchema)

Attraverso il model è possibile eseguire le classiche operazioni “CRUD” sulla collection (vedi documentazione mongoose model).

Nell’esempio, la definizione di schemi e modelli sono nel modulo “Models”, che utilizza mongoose come dipendenza.

MongoosePopolamento collection “events”

Il file “techbar-initdb.js” mostra un esempio di popolamento della collection “events”.

Viene chiamato il metodo “save” (in questo caso senza callback).

MongooseEsempio completo

Nel file “server.js” vengono mostrati i seguenti aspetti:- Creazione di un server http- Definizione di routes- Definizone del modulo “Routes” (CRUD)- Pagina di test (html + js)

MongooseEsempio completo >> Routes

var...Models = require('./lib/Models'),models = Models.create(mongoose),Routes = require('./lib/Routes'),routes = Routes.create(models);

MongooseEsempio completo >> Routes

router.get('/list', routes.list);…….app.use('/api', router);

http://localhost:3000/api/list

MongooseRicerca

models.Event.find(conditions, function(err, result) {handleResponse(response, err, result);

});

MongooseConditions

MongooseConditions

MongooseInserimento

event = new models.Event(data);

event.save(function(err, result) {handleResponse(response, err, result);

});

MongooseCancellazione

models.Event.findOne({ "_id": eventId }, function(err, doc) {if (!err) {

doc.remove(function(errRemove) {handleResponse(response, errRemove, eventId);

});} else {

handleResponse(response, true, 'not found!');}

});

MongooseMap-Reduce

http://docs.mongodb.org/manual/core/map-reduce/

Map-reduce is a data processing paradigm for condensing large volumes of data into useful aggregated results.

MongooseMap-Reduce

MongooseMap-Reduce

MongooseMap-Reduce

var o = {};o.scope = {

...};o.map = function() {

...};o.reduce = function(key, values) {

...};

models.Event.mapReduce(o, function(err, results, stats) {...

});

Ringraziamenti