Node.js

60

description

Einstieg in Node.js

Transcript of Node.js

Page 1: Node.js
Page 2: Node.js

WER BIN ICH?

• Sebastian Springer

• https://github.com/sspringer82

• @basti_springer

• Consultant, Trainer, Autor

Page 3: Node.js

Was erzähle ich euch heute?

Page 4: Node.js

Applikationen in Node.js

Page 5: Node.js

Aufbau

Bernd Kasper / pixelio.de

Page 6: Node.js

Standard Library

Node Bindings

V8 libuv

Eventloop async I/O

...insert����������� ������������������  your����������� ������������������  source����������� ������������������  code����������� ������������������  here...

Page 7: Node.js

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

Page 8: Node.js

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

Page 9: Node.js

package.json

Page 10: Node.js

{! "name": "express",! "description": "",! "version": "4.2.0",! "author": {},! "dependencies": {},! "devDependencies": {},! "keywords": [],! "repository": {},! "scripts": {},! "engines": {},! "license": "MIT",! "readme": "",!}

C:\WINDOWS> npm init

Page 11: Node.js

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

Page 12: Node.js

Modulsystem

Initiative Echte Soziale Marktwirtschaft IESM / pixelio.de

Page 13: Node.js

Das Modulsystem

eigene Module

NPM

interne Module

Page 14: Node.js

require

Page 15: Node.js

Interne Module

var fs = require(‘fs’);!!fs.readFile(‘/tmp/input.txt’, ‘utf-8’, function(err, data) {! console.log(‘data’);!});

Page 16: Node.js

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

Page 17: Node.js

Eigene Module

var fs = require(‘fs’);!!module.exports = {! readFile: function() {! return fs.readFileSync(‘/tmp/input.txt’, ‘utf-8’);! }!}

myModule.js

Page 18: Node.js

Eigene Module

var myModule = require(‘./myModule’);!!var data = myModule.readFile();!!console.log(data);

index.js

Page 19: Node.js

Beispiel express Applikation

Tim Reckmann / pixelio.de

Page 20: Node.js

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.

Page 21: Node.js

Initiierung

var express = require(‘express’);!!var app = express();!!app.listen(8080);

Page 22: Node.js

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.

Page 23: Node.js

Routingmodule.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

Page 24: Node.js

Statischer Inhalt

Es ist kein zusätzlicher Webserver erforderlich. Node.js liefert HTML, CSS, clientseitiges

JavaScript und Mediendateien selbst aus.

Page 25: Node.js

Statischer Inhalt

app.use(express.static(__dirname + '/public'));

Page 26: Node.js

MiddlewareRequest

Response

func(req,res, next)

func(req,res, next)

func(req,res, next)

Page 27: Node.js

Template Engine

Generiertes HTML mit dynamischen Inhalten. Es sind mehrere Template Engines verfügbar

z.B. Jade, Twig oder Handlebars.

Page 28: Node.js

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’);!});

Page 29: Node.js

Datenbanken

Tim Reckmann / pixelio.de

Page 30: Node.js

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.

Page 31: Node.js

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

Page 32: Node.js

Asynchronität

Rainer Sturm / pixelio.de

Page 33: Node.js

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.

Page 34: Node.js

Promises

Versprechen auf die Erfüllung einer asynchronen Operation.

Page 35: Node.js

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);!});

Page 36: Node.js

Skalierung

Uwe Schlick / pixelio.de

Page 37: Node.js

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.

Page 38: Node.js

Webserver

Page 39: Node.js

Webserver

$ curl localhost:8080 & curl localhost:8080 &

$ node server.js

incoming request!request answered in: 4636ms!incoming request!request answered in: 4622ms

Page 40: Node.js

Child_Process

Page 41: Node.js

Child_Process

$ curl localhost:8080 & curl localhost:8080 &

$ node server2.js

incoming request!incoming request!request answered in: 4959ms!request answered in: 4963ms

Page 42: Node.js

Cluster

Page 43: Node.js

Cluster

Es werden Kindprozesse über die fork-Methode erzeugt. Die Kindprozesse teilen sich einen

TCP-Port. Das Betriebssystem übernimmt das

Loadbalancing.

Page 44: Node.js

Child_Process

$ curl localhost:8080 & curl localhost:8080 &

$ node cluster.js

incoming request!incoming request!request answered in: 4878ms!request answered in: 4885ms

Page 45: Node.js

Loadbalancer

Page 46: Node.js

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.

Page 47: Node.js

Cloud

Page 48: Node.js

Cloud

Cloud Support in Heroku und Microsoft Azure. Applikationen werden deployed und

Knoten können nach Bedarf hochgefahren werden.

Page 49: Node.js

Tests

uygar sanli / pixelio.de

Page 50: Node.js

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.

Page 51: 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

Page 52: Node.js

nodeunit

Page 53: Node.js

nodeunit$ nodeunit test.js !!

test.js!setUp!firstExample!tearDown!✔ firstExample!setUp!tearDown!✔ exampleGroup - secondExample!!

OK: 2 assertions (8ms)

Page 54: Node.js

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.

Page 55: Node.js

Mocha

Page 56: Node.js

$ mocha test!!

․․․․․․․․․․․․․․․․!!

16 passing (48ms)

Mocha

Page 57: Node.js

Mocha

Installation über npm install -g mocha!Eigenständiges Testframework, das

zusätzliche Assertion Libraries wie expect.js und should.js einbindet.

Nicht nur für Node.js exklusiv.

Page 58: Node.js

describe("Subject", function () {! it("should do something", function () {! expect(true).to.eql(true);! });! it.only("should do something", function () {! expect(true).to.eql(true);! });! it.skip("should do something", function () {! expect(true).to.eql(true);! });!});

Page 59: Node.js

Fragen

Angela Parszyk / pixelio.de

Page 60: Node.js

KONTAKT

Sebastian Springer [email protected] !Mayflower GmbH Mannhardtstr. 6 80538 München Deutschland !@basti_springer !https://github.com/sspringer82