WER BIN ICH?
• Sebastian Springer	

• https://github.com/sspringer82	

• @basti_springer	

• Consultant,Trainer,Autor
Was erzähle ich euch
heute?
Applikationen in
Node.js
Aufbau
Bernd Kasper / pixelio.de
Standard Library
Node Bindings
V8 libuv
Eventloop async I/O
...insert
 your
 source
 code
 here...
Repo
npmjs.org
CouchDB
75k Pakete
npm Kommandozeilen
Tool
Bestandteil von
Node.js seit 0.6.3
Open Source
https://github.com/
npm/npm
installation
node_modules
Einfaches Publizieren
C:WINDOWS_
C:WINDOWS npm search express
C:WINDOWS npm install express
C:WINDOWS npm list
C:WINDOWS npm update express
C:WINDOWS npm remove express
package.json
{!
name: express,!
description: ,!
version: 4.2.0,!
author: {},!
dependencies: {},!
devDependencies: {},!
keywords: [],!
repository: {},!
scripts: {},!
engines: {},!
license: MIT,!
readme: ,!
}
C:WINDOWS npm init
C:WINDOWS npm install --save express!
npm http GET https://registry.npmjs.org/express
.!
! node_modules!
! express
dependencies: {!
express: ~4.3.1!
},
package.json
current folder
Modulsystem
Initiative Echte Soziale Marktwirtschaft IESM / pixelio.de
Das Modulsystem
eigene Module
NPM
interne Module
require
Interne Module
var fs = require(‘fs’);!
!
fs.readFile(‘/tmp/input.txt’, ‘utf-8’,
function(err, data) {!
console.log(‘data’);!
});
NPM Module
var express = require(‘express’);!
!
var app = express();!
!
app.get(‘/‘, function(req, res) {!
res.send(‘Hello World’);!
});!
!
app.listen(8080);
C:WINDOWS npm install express
Eigene Module
var fs = require(‘fs’);!
!
module.exports = {!
readFile: function() {!
return fs.readFileSync(‘/tmp/
input.txt’, ‘utf-8’);!
}!
}
myModule.js
Eigene Module
var myModule = require(‘./myModule’);!
!
var data = myModule.readFile();!
!
console.log(data);
index.js
Beispiel express
Applikation
Tim Reckmann / pixelio.de
express.js
Web Application Framework. Baut auf dem http-
Modul von Node.js auf. Bietet Middleware-
Komponenten, mit denen auf Requests reagiert
werden kann. Zusätzlich verfügt express.js über
einen Router.
Initiierung
var express = require(‘express’);!
!
var app = express();!
!
app.listen(8080);
Routing
Navigation in der Applikation per URL.
Variablen in URLs für dynamische Inhalte.
Eine Route besteht aus zwei Teilen: HTTP-
Methode und Pfad.
Routendefinition in eine separate Datei
auslagern.
Routing
module.exports = function(app) {!
app.get(‘/‘, function(req, res) {!
res.end(‘Hello World’);!
});!
app.get(‘/user/:id’, function(req, res) {!
res.end(‘Requested User: ‘ +
req.params.id);!
});!
};
var router = require(‘./router’);!
router(app);
router.js
index.js
Statischer Inhalt
Es ist kein zusätzlicher Webserver
erforderlich. Node.js liefert HTML, CSS, clientseitiges
JavaScript und Mediendateien selbst aus.
Statischer Inhalt
app.use(express.static(__dirname + '/
public'));
Middleware
Request
Response
func(req,res, next)
func(req,res, next)
func(req,res, next)
Template Engine
Generiertes HTML mit dynamischen Inhalten.
Es sind mehrere Template Engines verfügbar
z.B. Jade, Twig oder Handlebars.
Template Engine
var hbs = require(‘express-hbs');!
app.engine('hbs', hbs.express3());!
var view = path.join(__dirname, 'views');!
app.set('views', view);!
app.set('view engine', ‘hbs');
app.get(‘/‘, function(req, res) {!
res.render(‘index’);!
});
Datenbanken
Tim Reckmann / pixelio.de
Datenbanken
Speichern und Auslesen dynamischer Inhalte.
Es werden nahezu alle Datenbanken unterstützt
z.B. mySQL, SQLite, Redis, MongoDB.
Zugriffe auf Datenbanken sind in der Regel
asynchron.
Datenbanken
var sqlite = require(‘sqlite3’);!
!
var db = new sqlite.Database(‘/tmp/db’);!
!
db.get(‘SELECT * FROM users’, function(err,
data) {!
res.send(‘Hello ‘ + data.name);!
});
C:WINDOWS npm install sqlite3
Asynchronität
Rainer Sturm / pixelio.de
Asynchronität
Nahezu alle Operationen in Node.js sind
asynchron. Das gilt vom Webserver über den
Zugriff auf das Dateisystem bis hin zu
Datenströmen. Es wird viel mit Callback-
Funktionen gearbeitet. Diese können mit Promises
besser verwaltet werden.
Promises
Versprechen auf die Erfüllung einer
asynchronen Operation.
var myAsyncFunc = function() {!
var deferred = Q.defer();!
fs.readFile('input.txt', 'utf-8',
function(err, data) {!
if (err) {!
deferred.reject(err);!
} else {!
deferred.resolve(data);!
}!
});!
return deferred.promise;!
}!
!
myAsyncFunc().then(function(data) {!
console.log(data);!
});
Skalierung
Uwe Schlick / pixelio.de
Skalierung
Node.js ist im Normalfall Single Threaded und
kann deswegen nur mit einer bestimmten Anzahl
von Anfragen umgehen. Ressourcen eines
Servers können nicht vollständig ausgeschöpft
werden.
Es existieren mehrere Lösungszenarien.
Webserver
Webserver
$ curl localhost:8080 
curl localhost:8080 
$ node server.js
incoming request!
request answered in: 4636ms!
incoming request!
request answered in: 4622ms
Child_Process
Child_Process
$ curl localhost:8080 
curl localhost:8080 
$ node server2.js
incoming request!
incoming request!
request answered in: 4959ms!
request answered in: 4963ms
Cluster
Cluster
Es werden Kindprozesse über die fork-Methode
erzeugt. Die Kindprozesse teilen sich einen
TCP-Port.
Das Betriebssystem übernimmt das
Loadbalancing.
Child_Process
$ curl localhost:8080 
curl localhost:8080 
$ node cluster.js
incoming request!
incoming request!
request answered in: 4878ms!
request answered in: 4885ms
Loadbalancer
Loadbalancer
Mit einer Shared Nothing-Architektur kann
Node.js problemlos hinter einem Loadbalancer
betrieben werden.
Gemeinsamer Applikationsstatus wird über
eine Datenbank wie Memcache oder Redis
verwaltet.
Gut eignen sich z.B. HAProxy oder Nginx.
Cloud
Cloud
Cloud Support in Heroku und Microsoft
Azure. Applikationen werden deployed und
Knoten können nach Bedarf hochgefahren
werden.
Tests
uygar sanli / pixelio.de
Tests
Node.js ist selbst recht ordentlich getestet (tests/
simple/*.js). Es verfügt über ein eigenes
Testframework (assert-Modul).
Es gibt verschiedene Unittest-
Frameworks für Node.js.
$ wget http://nodejs.org/dist/v0.10.26/
node-v0.10.26.tar.gz
$ tar xvzf node-v0.10.26.tar.gz
$ cd node-v0.10.26/test/simple
$ node test-http.js
{ accept: '*/*',
foo: 'bar',
host: 'localhost:12346',
connection: 'keep-alive' }
DEBUG: Got /hello response
DEBUG: Got /world response
DEBUG: responses_recvd: 2
DEBUG: responses_sent: 2
nodeunit
nodeunit
$ nodeunit test.js !
!
test.js!
setUp!
firstExample!
tearDown!
✔ firstExample!
setUp!
tearDown!
✔ exampleGroup - secondExample!
!
OK: 2 assertions (8ms)
nodeunit
Installation über npm install -g nodeunit.
nodeunit ist ein eigenständiges Testframework.
Bietet übersichtlichere Ausgabe als das Assert-
Modul.
Die verfügbaren Assertions sind ähnlich wie die
des Assert-Moduls.
Mocha
$ mocha test!
!
․․․․․․․․․․․․․․․․!
!
16 passing (48ms)
Mocha

Node.js