Node.js
-
Upload
sebastian-springer -
Category
Software
-
view
289 -
download
4
description
Transcript of Node.js
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.
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
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'));
MiddlewareRequest
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
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.
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);! });!});
Fragen
Angela Parszyk / pixelio.de
KONTAKT
Sebastian Springer [email protected] !Mayflower GmbH Mannhardtstr. 6 80538 München Deutschland !@basti_springer !https://github.com/sspringer82