techbar nodejs+mongodb+mongoose
TRANSCRIPT
Me (www.massimobiagioli.it)
[email protected] massimo.biagioli maxbiag80 +MassimoBiagioli massimo-biagioli/28/8b0/94 massimobiagioli
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"}
NodejsDefinizione
var printUserAgent = function(req, res, next) {var userAgent = req.headers['user-agent'];
if (userAgent.indexOf('Mozilla') > -1) {console.log('Dovresti usare IE!!!');
}next();
};
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));
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
NodejsInsidie >> La Piramide di Doom
Esempio:techbar-getting-started-04.js
Soluzione:techbar-getting-started-05.js
q
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”.
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.
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);
});
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
var o = {};o.scope = {
...};o.map = function() {
...};o.reduce = function(key, values) {
...};
models.Event.mapReduce(o, function(err, results, stats) {...
});