SlideShare ist ein Scribd-Unternehmen logo
1 von 68
Downloaden Sie, um offline zu lesen
für Webapplikationen
Alexandra H. / pixelio.de
WER BIN ICH?
• Sebastian Springer	

• https://github.com/sspringer82	

• @basti_springer	

• Consultant,Trainer,Autor
Rudolpho Duba / pixelio.de
var http = require(‘http');!
!
http.createServer(function (req, res) {!
res.writeHead(200, !
{'Content-Type': 'text/plain'});!
res.end('Hello Worldn');!
}).listen(1337, ‘127.0.0.1');!
!
console.log('Server running at localhost');
Heute machen wir kein plain Node.js
Wie baue ich mit Node.js eine stabile und performante
Webapplikation?
Für die ich mich später nicht schämen muss…
Struktur
Monika Weidenhaupt / pixelio.de
Struktur bedeutet Organisation des Quellcodes in
Komponenten, Dateien und Verzeichnisse.
Ziel ist eine Verbesserung der
Wartbarkeit und Erweiterbarkeit.
…und ja, das geht mit Node.js
Modulsystem
Das Node.js-Modulsystem zur Aufteilung in Dateien nutzen.
Einbinden von Dateien kostet nichts, Node.js verfügt über
einen Modulcache.
$ node cache2.js
In Module
Module function
Module function
var foo = require('./myFile');
var bar = require('./myFile');
!
foo.myFunc();
bar.myFunc();
console.log('In Module');
!
module.exports = {
myFunc: function() {console.log('Module function');}
};
Frameworks?
Beat Kohler / pixelio.de
Frameworks liefern Strukturkomponenten, Hilfsfunktionen
und eine Reihe von Best Practices.
!
Frameworks lösen Probleme, von denen du noch nicht einmal
wusstest, dass du sie haben wirst.
TemplatingModular Routing Extensible
Jade
Handlebars
Middleware MiddlewareHTTP-Methods
Sehr weit verbreitetes Web Application Framework auf Basis
von Node.js-http und Connect.
var express = require('express');!
var app = express();!
!
app.get('/', function(req, res){!
res.send('hello world');!
});!
!
app.listen(3000);
TemplatingModular Routing Extensible
Jade
Handlebars
Middleware MiddlewareHTTP-Methods
Neues, noch experimentelles Framework, das auf ECMAScript
6-Features setzt (min. node-v0.11).
Bessere Unterstützung von Promises und potenzieller
Nachfolger von express.
var koa = require('koa');!
var app = koa();!
!
// logger!
app.use(function *(next){!
var start = new Date;!
yield next;!
var ms = new Date - start;!
console.log('%s %s - %s', this.method, !
this.url, ms);!
});!
!
// response!
app.use(function *(){!
this.body = 'Hello World';!
});!
!
app.listen(3000);
TemplatingModular Routing Extensible
PlatesMiddleware
Middleware
Plugins
Director
Ein wesentlich kleineres Framework als express. Unterstützt
die wichtigsten Funktionen, die für den Aufbau einer Web
Applikation benötigt werden.
var flatiron = require('flatiron'),!
app = flatiron.app;!
!
app.use(flatiron.plugins.http);!
!
app.router.get('/', function () {!
this.res.writeHead(200, { !
'Content-Type': 'text/plain' !
});!
this.res.end('Hello world!n');!
});!
!
app.start(8080);
TemplatingModular Routing Extensible
own engineModules OverwritesHTTP-Methods
Im Vergleich zu express ein vergleichsweise kleines
Framework. Umfangreiche Abdeckung der Problemstellungen.
var framework = require('total.js');!
var http = require('http');!
!
var debug = true;!
!
framework.run(http, debug, 8005);
exports.install = function(framework) {!
framework.route('/', view_homepage);!
framework.route('/{link}/', view_detail);!
};!
!
function view_homepage() {!
var self = this;!
self.view('homepage');!
}
Wir bauen eine MVC-Applikation.
Wir bauen eine MVC-
Applikation
Bernd Kasper / pixelio.de
Verzeichnisstruktur
.!
!"" controllers!
#   $"" index.js!
!"" index.js!
!"" models!
#   $"" user.js!
!"" public!
!"" router.js!
$"" views!
$"" login.js
index.js
var express = require('express');!
var bodyParser = require('body-parser');!
var routes = require('./router');!
!
var app = express();!
!
app.use(bodyParser.json());!
!
app.use('/', express.static(__dirname + '/public'));!
!
routes(app);!
!
app.listen(8080);
router.js
var express = require('express');!
!
var todoController = require('./controllers/todo');!
!
module.exports = function(app) {!
var todoRouter = express.Router();!
!
todoRouter.get('/', todoController.getAllAction);!
todoRouter.get('/:id', todoController.getOneAction);!
todoRouter.post('/', todoController.createAction);!
todoRouter.put('/:id', todoController.updateAction);!
todoRouter.delete('/:id',
todoController.deleteAction);!
!
app.use('/todo', todoRouter);!
};
Controller
Funktionen, die hinter den einzelnen Routen stehen. Erhalten
das Request- und Response-Objekt.
Models
Hier liegt die eigentliche Business-Logik der Applikation.
Die eingehenden Informationen werden validiert und
verarbeitet und gegebenenfalls in die Datenbank
gespeichert.
Datenbanken?
Tim Reckmann / pixelio.de
Datenbanken
1. Treiber installieren
!
npm install sqlite3
2. Verbindung aufbauen
!
var db = new sqlite3.Database(‘./db/myDb.db');
3. Abfragen
!
db.get(sql, id, function(err, row) {!
… !
});
Promises
mit Q
JMG / pixelio.de
Das Versprechen auf die Erfüllung einer asynchronen
Funktion.
db.query(sql, function(err, data) {!
if(err) {!
throw err;!
} else {!
console.log(data);!
}!
});
var q = require(‘q’);!
!
function queryWrapper(sql) {!
var deferred = q.defer();!
db.query(sql, function(err, data) {!
if(err) {!
deferred.reject(err);!
} else {!
deferred.resolve(data);!
}!
});!
return deferred.promise;!
}
var sql = ‘SELECT * FROM users’;!
!
var promise = queryWrapper(sql)!
!
promise.then(function(data) {!
// success !
…!
}, function(err) {!
// failure!
…!
});
Warum Promises?
Escape the Callback Hell!
Bessere Flusssteuerung für asynchrone Calls wie z.B. Merge.
Quasi synchrone Programmierung trotz Asynchronität
Promises mit koa
// curl -X GET http://localhost:8080/user/1!
app.get('/user/:id', function *(next) {!
var user = yield movieModel.get(this.params.id);!
this.body = JSON.stringify(user);!
});
ORM
○␣
␣
var express = require('express');!
var orm = require('orm');!
var app = express();!
!
app.use(orm.express("mysql://username:password@host/
database", {!
define: function (db, models, next) {!
models.person = db.define("person", { ... });!
next();!
}!
}));!
app.listen(80);!
!
app.get("/", function (req, res) {!
req.models.person.find(...);!
});
npm install orm
Template Engines
Paketverwaltung
Der Node Package Manager ist seit der Version 0.6.3 Teil von
Node.js.
Installation, Update und Removal von Paketen.
Das zentrale Repo liegt unter npmjs.org.
Aktuell gibt es > 83k Pakete.
Jeder kann Pakete veröffentlichen.
!
Jedes Paket löst seine eigenen Abhängigkeiten auf.
Konfigurationsdatei für ein Projekt.
Wird mit npm init erstellt.
Enthält viele Meta-Informationen und die Abhängigkeiten.
package.json
• node_modules: Verzeichnis, in das die Abhängigkeiten
installiert werden (sollte im VCS ignoriert werden).
!
• npm install: Installiert sämtliche Abhängigkeiten aus der
package.json automatisch.
!
• npm install --save: Trägt die Abhängigkeiten in die
package.json ein.
Distribution
Gabi Schoenemann / pixelio.de
• Installation über npmjs.org
• Installation eines Pakets aus einem Verzeichnis
• Installation eines Pakets aus einer .tgz-Datei
Voraussetzung: package.json muss vorhanden sein
Skalierung
Node.js ist im Kern klein und leichtgewichtig.
Node.js ist Single-Threaded.
Node.js schlägt sich als Einzelkämpfer recht gut.
ABER: das alles hat auch seine Grenzen.
Multi-Threaded
lichtkunst.73 / pixelio.de
Mit Boardmitteln
child_process cluster
child_process
Manuelles Forken von Kindprozessen.
Prozesse können über Nachrichten kommunizieren.
ACHTUNG: Kinder kosten… Ressourcen
var cp = require('child_process');!
!
var sub = cp.fork(__dirname + '/sub.js');!
!
sub.on('message', function(m) {!
console.log('PARENT got message:', m);!
});!
!
sub.send({ hello: 'world' });
process.on('message', function(m) {!
console.log('CHILD got message:', m);!
});!
!
process.send({ foo: 'bar' });
Parent
Child
cluster
Skalierung für socket-basierte Module wie z.B. http.
Betriebssystem übernimmt das Loadbalancing.
Die Prozesse teilen sich einen Port.
var cluster = require('cluster');!
var http = require('http');!
var numCPUs = require('os').cpus().length;!
!
if (cluster.isMaster) {!
for (var i = 0; i < numCPUs; i++) {!
cluster.fork();!
}!
!
cluster.on('exit', function(worker, code, signal) {!
console.log('worker ' + worker.process.pid + ' died');!
});!
} else {!
http.createServer(function(req, res) {!
res.writeHead(200);!
res.end("hello worldn");!
}).listen(8000);!
}
In die Breite
Loadbalancer
Node Server 1 Node Server 2
Datenbank
cloud
Hasan Anac / pixelio.de
Performance
Thomas Siepmann / pixelio.de
Performance
• Kein synchroner Code
• Keine statischen Assets - z.B. Nginx einsetzen
• Den Client rendern lassen - JSON-Kommunikation
• gzip nutzen
• Binärmodule sind schneller - z.B. mySQL
Qualität
Karl-Heinz Laube / pixelio.de
jslint/jshint
npm install -g jslint
!
Werkzeuge zur statischen Codeanalyse.
Finden Syntaxfehler und Antipatterns.
$ jslint index.js
!
index.js
#1 Unexpected dangling '_' in '__dirname'.
app.use('/', express.static(__dirname + '/public')); // Line 9, Pos 29
Copy-Paste-Detection
npm install -g jscpd
!
Findet duplizierten Quellcode im Projekt.
$ jscpd -f app.js
!
info: Found 7 exact clones with 70 duplicated lines in 1 files
- app.js:6626 -6635
app.js:6646 -6655
Plato
npm install -g plato
!
Visualisierung der Komplexität einer Applikation.
Metriken: Maintainability, Lines of Code, Estimated Errors in
Implementation, Lint Errors
Testing
assert
Mocha
nodeunit
jasmine-node
uygar sanli / pixelio.de
Janina Briesemeister / pixelio.de
KONTAKT
Sebastian Springer
sebastian.springer@mayflower.de
!
Mayflower GmbH
Mannhardtstr. 6
80538 München
Deutschland
!
@basti_springer
!
https://github.com/sspringer82

Weitere ähnliche Inhalte

Andere mochten auch

taste! Spotlight #11: A new star is born! - Produktentwicklung
taste! Spotlight #11: A new star is born! - Produktentwicklungtaste! Spotlight #11: A new star is born! - Produktentwicklung
taste! Spotlight #11: A new star is born! - Produktentwicklungtaste_Offenbach
 
Webinar Test-Driven JavaScript
Webinar Test-Driven JavaScriptWebinar Test-Driven JavaScript
Webinar Test-Driven JavaScriptSebastian Springer
 
Pair Programming Mythbusters
Pair Programming MythbustersPair Programming Mythbusters
Pair Programming MythbustersMayflower GmbH
 
Scrum als agiles Vorgehensmodell für Programmierer
Scrum als agiles Vorgehensmodell für ProgrammiererScrum als agiles Vorgehensmodell für Programmierer
Scrum als agiles Vorgehensmodell für ProgrammiererTobias Schlüter
 

Andere mochten auch (9)

taste! Spotlight #11: A new star is born! - Produktentwicklung
taste! Spotlight #11: A new star is born! - Produktentwicklungtaste! Spotlight #11: A new star is born! - Produktentwicklung
taste! Spotlight #11: A new star is born! - Produktentwicklung
 
Webinar Test-Driven JavaScript
Webinar Test-Driven JavaScriptWebinar Test-Driven JavaScript
Webinar Test-Driven JavaScript
 
Pair Programming Mythbusters
Pair Programming MythbustersPair Programming Mythbusters
Pair Programming Mythbusters
 
Scrum als agiles Vorgehensmodell für Programmierer
Scrum als agiles Vorgehensmodell für ProgrammiererScrum als agiles Vorgehensmodell für Programmierer
Scrum als agiles Vorgehensmodell für Programmierer
 
Profiling for Grown-Ups
Profiling for Grown-UpsProfiling for Grown-Ups
Profiling for Grown-Ups
 
Agiles Schätzen - AgileUG Unterfranken
Agiles Schätzen - AgileUG UnterfrankenAgiles Schätzen - AgileUG Unterfranken
Agiles Schätzen - AgileUG Unterfranken
 
5 Ways NCM Can Save You From A Disaster
5 Ways NCM Can Save You From A Disaster5 Ways NCM Can Save You From A Disaster
5 Ways NCM Can Save You From A Disaster
 
Agile Anti-Patterns
Agile Anti-PatternsAgile Anti-Patterns
Agile Anti-Patterns
 
Php und das lean startup
Php und das lean startupPhp und das lean startup
Php und das lean startup
 

Ähnlich wie Webapplikationen mit Node.js

Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit RustJens Siebert
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit RustJens Siebert
 
Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010Patrick Lauke
 
Production-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenProduction-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenAndré Goliath
 
Einführung in die webOS Programmierung
Einführung in die webOS ProgrammierungEinführung in die webOS Programmierung
Einführung in die webOS ProgrammierungMarkus Leutwyler
 
Modern angular 02_angular_mit_type_script
Modern angular 02_angular_mit_type_scriptModern angular 02_angular_mit_type_script
Modern angular 02_angular_mit_type_scriptManfred Steyer
 
JsUnconf 2014
JsUnconf 2014JsUnconf 2014
JsUnconf 2014emrox
 
Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!gedoplan
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenMayflower GmbH
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsJosef Adersberger
 

Ähnlich wie Webapplikationen mit Node.js (20)

Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit Rust
 
Node.js
Node.jsNode.js
Node.js
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 
Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010Die Zukunft der Webstandards - Webinale 31.05.2010
Die Zukunft der Webstandards - Webinale 31.05.2010
 
Production-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenProduction-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 Wochen
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
 
PHP Sucks?!
PHP Sucks?!PHP Sucks?!
PHP Sucks?!
 
Einführung in die webOS Programmierung
Einführung in die webOS ProgrammierungEinführung in die webOS Programmierung
Einführung in die webOS Programmierung
 
Modern angular 02_angular_mit_type_script
Modern angular 02_angular_mit_type_scriptModern angular 02_angular_mit_type_script
Modern angular 02_angular_mit_type_script
 
Testing tools
Testing toolsTesting tools
Testing tools
 
JsUnconf 2014
JsUnconf 2014JsUnconf 2014
JsUnconf 2014
 
Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Einsteiger Workshop
Einsteiger WorkshopEinsteiger Workshop
Einsteiger Workshop
 
A/B Testing mit Node.js
A/B Testing mit Node.jsA/B Testing mit Node.js
A/B Testing mit Node.js
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Rack-Middleware
Rack-MiddlewareRack-Middleware
Rack-Middleware
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 

Mehr von Sebastian Springer

Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsSebastian Springer
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsSebastian Springer
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceSebastian Springer
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebSebastian Springer
 
ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebSebastian Springer
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJSSebastian Springer
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtSebastian Springer
 

Mehr von Sebastian Springer (20)

Schnelleinstieg in Angular
Schnelleinstieg in AngularSchnelleinstieg in Angular
Schnelleinstieg in Angular
 
Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.js
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web Performance
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im Web
 
Angular2
Angular2Angular2
Angular2
 
Einführung in React
Einführung in ReactEinführung in React
Einführung in React
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im Produktivbetrieb
 
Streams in Node.js
Streams in Node.jsStreams in Node.js
Streams in Node.js
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
Typescript
TypescriptTypescript
Typescript
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
 
Lean Startup mit JavaScript
Lean Startup mit JavaScriptLean Startup mit JavaScript
Lean Startup mit JavaScript
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
 
JavaScript Architektur
JavaScript ArchitekturJavaScript Architektur
JavaScript Architektur
 
Angular translate
Angular translateAngular translate
Angular translate
 

Webapplikationen mit Node.js

  • 2. Alexandra H. / pixelio.de
  • 3. WER BIN ICH? • Sebastian Springer • https://github.com/sspringer82 • @basti_springer • Consultant,Trainer,Autor
  • 4.
  • 5. Rudolpho Duba / pixelio.de
  • 6. var http = require(‘http');! ! http.createServer(function (req, res) {! res.writeHead(200, ! {'Content-Type': 'text/plain'});! res.end('Hello Worldn');! }).listen(1337, ‘127.0.0.1');! ! console.log('Server running at localhost'); Heute machen wir kein plain Node.js
  • 7. Wie baue ich mit Node.js eine stabile und performante Webapplikation? Für die ich mich später nicht schämen muss…
  • 9. Struktur bedeutet Organisation des Quellcodes in Komponenten, Dateien und Verzeichnisse. Ziel ist eine Verbesserung der Wartbarkeit und Erweiterbarkeit. …und ja, das geht mit Node.js
  • 10. Modulsystem Das Node.js-Modulsystem zur Aufteilung in Dateien nutzen. Einbinden von Dateien kostet nichts, Node.js verfügt über einen Modulcache.
  • 11. $ node cache2.js In Module Module function Module function var foo = require('./myFile'); var bar = require('./myFile'); ! foo.myFunc(); bar.myFunc(); console.log('In Module'); ! module.exports = { myFunc: function() {console.log('Module function');} };
  • 13. Frameworks liefern Strukturkomponenten, Hilfsfunktionen und eine Reihe von Best Practices. ! Frameworks lösen Probleme, von denen du noch nicht einmal wusstest, dass du sie haben wirst.
  • 14. TemplatingModular Routing Extensible Jade Handlebars Middleware MiddlewareHTTP-Methods Sehr weit verbreitetes Web Application Framework auf Basis von Node.js-http und Connect.
  • 15. var express = require('express');! var app = express();! ! app.get('/', function(req, res){! res.send('hello world');! });! ! app.listen(3000);
  • 16. TemplatingModular Routing Extensible Jade Handlebars Middleware MiddlewareHTTP-Methods Neues, noch experimentelles Framework, das auf ECMAScript 6-Features setzt (min. node-v0.11). Bessere Unterstützung von Promises und potenzieller Nachfolger von express.
  • 17. var koa = require('koa');! var app = koa();! ! // logger! app.use(function *(next){! var start = new Date;! yield next;! var ms = new Date - start;! console.log('%s %s - %s', this.method, ! this.url, ms);! });! ! // response! app.use(function *(){! this.body = 'Hello World';! });! ! app.listen(3000);
  • 18. TemplatingModular Routing Extensible PlatesMiddleware Middleware Plugins Director Ein wesentlich kleineres Framework als express. Unterstützt die wichtigsten Funktionen, die für den Aufbau einer Web Applikation benötigt werden.
  • 19. var flatiron = require('flatiron'),! app = flatiron.app;! ! app.use(flatiron.plugins.http);! ! app.router.get('/', function () {! this.res.writeHead(200, { ! 'Content-Type': 'text/plain' ! });! this.res.end('Hello world!n');! });! ! app.start(8080);
  • 20. TemplatingModular Routing Extensible own engineModules OverwritesHTTP-Methods Im Vergleich zu express ein vergleichsweise kleines Framework. Umfangreiche Abdeckung der Problemstellungen.
  • 21. var framework = require('total.js');! var http = require('http');! ! var debug = true;! ! framework.run(http, debug, 8005); exports.install = function(framework) {! framework.route('/', view_homepage);! framework.route('/{link}/', view_detail);! };! ! function view_homepage() {! var self = this;! self.view('homepage');! }
  • 22.
  • 23. Wir bauen eine MVC-Applikation.
  • 24. Wir bauen eine MVC- Applikation Bernd Kasper / pixelio.de
  • 25. Verzeichnisstruktur .! !"" controllers! #   $"" index.js! !"" index.js! !"" models! #   $"" user.js! !"" public! !"" router.js! $"" views! $"" login.js
  • 26. index.js var express = require('express');! var bodyParser = require('body-parser');! var routes = require('./router');! ! var app = express();! ! app.use(bodyParser.json());! ! app.use('/', express.static(__dirname + '/public'));! ! routes(app);! ! app.listen(8080);
  • 27. router.js var express = require('express');! ! var todoController = require('./controllers/todo');! ! module.exports = function(app) {! var todoRouter = express.Router();! ! todoRouter.get('/', todoController.getAllAction);! todoRouter.get('/:id', todoController.getOneAction);! todoRouter.post('/', todoController.createAction);! todoRouter.put('/:id', todoController.updateAction);! todoRouter.delete('/:id', todoController.deleteAction);! ! app.use('/todo', todoRouter);! };
  • 28. Controller Funktionen, die hinter den einzelnen Routen stehen. Erhalten das Request- und Response-Objekt.
  • 29. Models Hier liegt die eigentliche Business-Logik der Applikation. Die eingehenden Informationen werden validiert und verarbeitet und gegebenenfalls in die Datenbank gespeichert.
  • 32. 1. Treiber installieren ! npm install sqlite3 2. Verbindung aufbauen ! var db = new sqlite3.Database(‘./db/myDb.db'); 3. Abfragen ! db.get(sql, id, function(err, row) {! … ! });
  • 33. Promises mit Q JMG / pixelio.de Das Versprechen auf die Erfüllung einer asynchronen Funktion.
  • 34. db.query(sql, function(err, data) {! if(err) {! throw err;! } else {! console.log(data);! }! });
  • 35. var q = require(‘q’);! ! function queryWrapper(sql) {! var deferred = q.defer();! db.query(sql, function(err, data) {! if(err) {! deferred.reject(err);! } else {! deferred.resolve(data);! }! });! return deferred.promise;! }
  • 36. var sql = ‘SELECT * FROM users’;! ! var promise = queryWrapper(sql)! ! promise.then(function(data) {! // success ! …! }, function(err) {! // failure! …! });
  • 37. Warum Promises? Escape the Callback Hell! Bessere Flusssteuerung für asynchrone Calls wie z.B. Merge. Quasi synchrone Programmierung trotz Asynchronität
  • 38. Promises mit koa // curl -X GET http://localhost:8080/user/1! app.get('/user/:id', function *(next) {! var user = yield movieModel.get(this.params.id);! this.body = JSON.stringify(user);! });
  • 40. var express = require('express');! var orm = require('orm');! var app = express();! ! app.use(orm.express("mysql://username:password@host/ database", {! define: function (db, models, next) {! models.person = db.define("person", { ... });! next();! }! }));! app.listen(80);! ! app.get("/", function (req, res) {! req.models.person.find(...);! }); npm install orm
  • 43. Der Node Package Manager ist seit der Version 0.6.3 Teil von Node.js. Installation, Update und Removal von Paketen. Das zentrale Repo liegt unter npmjs.org. Aktuell gibt es > 83k Pakete. Jeder kann Pakete veröffentlichen. ! Jedes Paket löst seine eigenen Abhängigkeiten auf.
  • 44. Konfigurationsdatei für ein Projekt. Wird mit npm init erstellt. Enthält viele Meta-Informationen und die Abhängigkeiten. package.json
  • 45. • node_modules: Verzeichnis, in das die Abhängigkeiten installiert werden (sollte im VCS ignoriert werden). ! • npm install: Installiert sämtliche Abhängigkeiten aus der package.json automatisch. ! • npm install --save: Trägt die Abhängigkeiten in die package.json ein.
  • 47. • Installation über npmjs.org • Installation eines Pakets aus einem Verzeichnis • Installation eines Pakets aus einer .tgz-Datei Voraussetzung: package.json muss vorhanden sein
  • 49. Node.js ist im Kern klein und leichtgewichtig. Node.js ist Single-Threaded. Node.js schlägt sich als Einzelkämpfer recht gut. ABER: das alles hat auch seine Grenzen.
  • 52. child_process Manuelles Forken von Kindprozessen. Prozesse können über Nachrichten kommunizieren. ACHTUNG: Kinder kosten… Ressourcen
  • 53. var cp = require('child_process');! ! var sub = cp.fork(__dirname + '/sub.js');! ! sub.on('message', function(m) {! console.log('PARENT got message:', m);! });! ! sub.send({ hello: 'world' }); process.on('message', function(m) {! console.log('CHILD got message:', m);! });! ! process.send({ foo: 'bar' }); Parent Child
  • 54. cluster Skalierung für socket-basierte Module wie z.B. http. Betriebssystem übernimmt das Loadbalancing. Die Prozesse teilen sich einen Port.
  • 55. var cluster = require('cluster');! var http = require('http');! var numCPUs = require('os').cpus().length;! ! if (cluster.isMaster) {! for (var i = 0; i < numCPUs; i++) {! cluster.fork();! }! ! cluster.on('exit', function(worker, code, signal) {! console.log('worker ' + worker.process.pid + ' died');! });! } else {! http.createServer(function(req, res) {! res.writeHead(200);! res.end("hello worldn");! }).listen(8000);! }
  • 57. Loadbalancer Node Server 1 Node Server 2 Datenbank
  • 58. cloud Hasan Anac / pixelio.de
  • 60. Performance • Kein synchroner Code • Keine statischen Assets - z.B. Nginx einsetzen • Den Client rendern lassen - JSON-Kommunikation • gzip nutzen • Binärmodule sind schneller - z.B. mySQL
  • 62. jslint/jshint npm install -g jslint ! Werkzeuge zur statischen Codeanalyse. Finden Syntaxfehler und Antipatterns. $ jslint index.js ! index.js #1 Unexpected dangling '_' in '__dirname'. app.use('/', express.static(__dirname + '/public')); // Line 9, Pos 29
  • 63. Copy-Paste-Detection npm install -g jscpd ! Findet duplizierten Quellcode im Projekt. $ jscpd -f app.js ! info: Found 7 exact clones with 70 duplicated lines in 1 files - app.js:6626 -6635 app.js:6646 -6655
  • 64. Plato npm install -g plato ! Visualisierung der Komplexität einer Applikation. Metriken: Maintainability, Lines of Code, Estimated Errors in Implementation, Lint Errors
  • 65.
  • 68. KONTAKT Sebastian Springer sebastian.springer@mayflower.de ! Mayflower GmbH Mannhardtstr. 6 80538 München Deutschland ! @basti_springer ! https://github.com/sspringer82